Problem beim Euklidischen Algorithmus
-
Es sieht zumindest mal wie ein Programm aus
. Doch mit dem c stimmt was nicht. Welchen Wert hat es zu Anfang? Und dein Algorithmus an sich sieht auch falsch aus.
-
Für mich sieht der ALgo gut aus. Übersehe ich was?
while (c==0); //Das Semikolon ist sicher falsch
Und c kann man auf irgendwas außer 0 setzen, dann müßte es schon klappen.
Aber dann isses auch noch häßlich.
Irgendwie mißhagt mir, c überhaupt außerhalb der Schleife zu haben.
-
SeppJ schrieb:
Es sieht zumindest mal wie ein Programm aus
. Doch mit dem c stimmt was nicht. Welchen Wert hat es zu Anfang? Und dein Algorithmus an sich sieht auch falsch aus.
Naja c hat zu Anfang keinen Wert, es soll halt den Rest darstellen.
-
volkard schrieb:
Für mich sieht der ALgo gut aus. Übersehe ich was?
while (c==0); //Das Semikolon ist sicher falsch
Und c kann man auf irgendwas außer 0 setzen, dann müßte es schon klappen.
Aber dann isses auch noch häßlich.
Irgendwie mißhagt mir, c überhaupt außerhalb der Schleife zu haben.Oh übersehen und weggemacht. Wenn ich das Programm compilen will, gibt es auch nur noch zwei Fehler:
In function 'int main()':
und
13: warning: unknown conversion type character 'b' in formatDas c kann ich ja nicht einfach weglassen, weil das ja immer der Rest ist
-
%b sollte %d oder %i sein, nehme ich an.
Haha!Wenn c außerhalb sein muß (was ich nicht so glauben mag), muß es eben außen sein. Erstmal zum Laufen kriegen.
Ich nehme an, == ist auch falsch und != war gemeint. while sagt ja "solange, wie die Bedingung erüllt ist, mach was". also gerade "solange der Rest == 0 ist". Nee, ==0 ist die Abbruchbedingung. In C hat man immer nur eine Laufbedingung.
-
volkard schrieb:
%b sollte %d oder %i sein, nehme ich an.
Haha!Wenn c außerhalb sein muß (was ich nicht so glauben mag), muß es eben außen sein. Erstmal zum Laufen kriegen.
Ich nehme an, == ist auch falsch und != war gemeint. while sagt ja "solange, wie die Bedingung erüllt ist, mach was". also gerade "solange der Rest == 0 ist". Nee, ==0 ist die Abbruchbedingung. In C hat man immer nur eine Laufbedingung.
Müsste ich dann nicht vorher irgendwo d oder i definiert haben?? Okay, ich hab das jetzt ersetzt, compilieren tut er es, ausführen muss ich montag gucken, wenn ich wieder linux habe.
Aber dankeschön erstmal an alle, die geholfen haben
-
Es gibt auch noch die do-while-Schleife, da wird erst am Schleifenende die Bedingung geprüft, also nach dem rechnen.
-
marco025 schrieb:
Müsste ich dann nicht vorher irgendwo d oder i definiert haben??
Nein,, da haste was verwechselt.. Ein printf("%i",i) sagt "gibt i als integer aus".. Ein printf("%i",d) sagt "gib d als integer aus".. Ein printf("%f",i) sagt "gib i als float aus"..
Das Zeichen nach % gibt den Datentyp an.. Nicht den Variablennamen..
-
Das Zeichen (der Formatspecifier) muss aber zum Datentyp der Variablen passen.
printf("%f",i) klappt nicht, wenn i ein int ist.
-
Okay, dankeschön für die Hilfe, ich hoffe es wird alles funktionieren
-
marco025 schrieb:
Okay, dankeschön für die Hilfe, ich hoffe es wird alles funktionieren
Wenns dann klappt, bitte nochmal zeigen!
Dann geht der Spaß erst los und alle Schulmeister sagen, was man daran noch besser machen könnte. Das solltest Du übrigens immer machen. Willst ja nicht bei der Note 1 nur meistens landen, sondern eine sichere 1 verteidigen. Das geht am besten, wenn Du den Tread nochmal fütterst und die verrücktesten Optimierungen folgen. Optimalerweise lernst Du den binary gcd kennen und Knuths Argument, weshalb man nicht if(a>b) braucht.
-
So es klappt, leider aber mit dem falschen Ergebnis, d.h er gibt 32156 aus, wie am anfang definiert und nicht die richtige Lösung
hier der code:
#include <stdio.h> main () { int a = 45823; int b = 32156; int c; while (c!=0) { c=a%b; a=b; b=c; } printf ("Der größte gemeinsame Teiler ist %i\n", b); }
-
Was meinst du, welchen Wert c im ersten Durchlauf in Zeile 7 hat?
-
Spontan würde ich sagen 0, bzw garkeinen, weil ich ihn ja vorher nicht definiert habe. Also würde ich sagen, dass es vllt besser wäre ne do... while schleife einzubauen, oder?? Dann würde es so aussehen, gibt mir aber als antwort nur die 0.
#include <stdio.h> main () { int a = 45819; int b = 54873; int c; do { c=a%b; a=b; b=c; } while (c!=0); printf ("Der größte gemeinsame Teiler ist %i\n", b); }
-
c kann irgendeinen Wert aus dem int-Bereich haben, in deinem Fall wird es aber gerade 0 sein.
Dadurch wird die Schleife erst gar nicht durchlaufen und somit wird nichts berechnet.Wie wärs mit deinem ersten Programm (while-Schleife) und c vor der Schleife mit a%b initialisieren.
-
do-while statt while ist in diesem Fall schon mal besser, du hast das Abbruchkriterium aber falsch eingesetzt und auch die Ergebnisvariable ist falsch, hast also eigentlich ziemlich viel falsch in den wenigen Zeilen.
Probiere malwhile (b!=0); printf ("Der größte gemeinsame Teiler ist %i\n", a);
und denke über die Änderungen nach.
-
So es läuft jetzt endlich, und auch richtig:
#include <stdio.h> main () { int a = 2394; int b = 4242; int c; do { c=a%b; a=b; b=c; } while (b!=0); printf ("Der größte gemeinsame Teiler ist %i\n", a); }
Danke für die Hilfe von allen, und wenn ich noch Verbesserungsvorschläge habt nur her damit, ich kann ja nur dazu lernen, was mir hoffentlich bei den nächsten Sachen weiterhilft
-
Es ist viel üblicher, so einzurücken, daß die Klammern sich sehen können.
#include <stdio.h> int main () { int a = 2394; int b = 4242; int c; do { c=a%b; a=b; b=c; } while (b!=0); printf ("Der größte gemeinsame Teiler ist %i\n", a); }
[/quote]