Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen
-
#include <iostream> using namespace std; //ekuldischen algrothmus //Problem ist das das der ggt_2 immer gleich ist obowhl er jedes mal aktuell sein soll! //(und nicht immer 247) int main() { int ggt_1; int ggt_2; int wie_oft_geht_passt; int alter_rest; int neuer_rest; int ggt; int kein_rest; cout << "Bitte geben sie ihren beide ggt ein: " << endl; cout << "Achten sie zuerst die groessere und dann die kleinere: " << endl; cin >> ggt_1;//589 cin >> ggt_2;//247 cout << "wie oft passt die: " << ggt_2 << " in die " << ggt_1 << " rein? " << endl; cin >> wie_oft_geht_passt;//2 //schritt 1 //Beispiel: 2 * 247 = 494 ggt = wie_oft_geht_passt * ggt_2; //cout << "akutueller ggt: " << ggt << endl;//494 //Rest berechung: //Rest 95 alter_rest = ggt_1 % ggt; cout << "Rest: " << alter_rest << endl; //wenn es rest gibt if (alter_rest != 0) { //läuft solnage bis rest 0 ist while (alter_rest != 0) { //Schritt 2 cout << "wie oft passt die: " << alter_rest << " in die " << ggt_2 << " rein? " << endl; cin >> wie_oft_geht_passt;//2 ggt = wie_oft_geht_passt * alter_rest;//2 * 95 = 190 cout << "Aktueller ggt: " << ggt << endl;//190 //Rest berechung: //Rest 95 alter_rest = ggt_2 % ggt;//247 % 190 = 57 cout << "Aktueller rest " << alter_rest << endl << endl;//57 } //Ausgabe auf der Konsole cout << "Der gemeinsame Teiler von den Zahlen: " << ggt_1 << " und " << ggt_2 << " ist: " << ggt << endl << endl; //wenn es keinen rest gibt } else if (alter_rest == 0) { //Rest berechung: //Rest 95 kein_rest = ggt_1 / ggt_2; cout << "Ergebniss ist: " << kein_rest << endl << endl; } return 0; }
Gude ich habe ein Programm geschrieben welches den ggt (Gemeinsamen Teiler) ausrechnen soll dafür habe ich den Euklidischer Algorithmus benutzt nur das Problem hierbei ist das ich nur den letzten Rest auf der konsole bekomme z.B
/*
Bitte geben sie ihren beide ggt ein:
Achten sie zuerst die groessere und dann die kleinere:
589
247wie oft passt die: 247 in die 589 rein?
2
Rest: 95wie oft passt die: 95 in die 247 rein?
2wie oft passt die: 57 in die 247 rein?
.......
*/hier beim letzten sollte stehen: wie oft passt die 57 in die 95 also praktisch der vorletzte Rest "95" anstatt die 247
die 247 steht nach jeder Eingabe anstatt der letzte berechnete Rest.Ich hoffe das ich es einigermaßen Verständissvoll war wenn nicht könnt mir gerne fragen
ich würde sehr dankbar sein wenn mir jemand hier helfen könnte ein großes Dankeschön schon voraus
-
Dein Code passt nicht zu deiner "Ausgabe"
Ich meine vor allem:cout << "wie oft passt die: " << alter_rest << " in die " << ggt_2 << " rein? " << endl;
ggt2
Wird in deiner Schleife nicht angepasst.Außerdem, irgendwie berechnest du wenig, sondern lässt den Nutzer rechnen
cin >> wie_oft_geht_passt;//2
Eigentlich willst du doch nur 2 Zahlen eingeben und dann den größten gemeinsamen Teiler berechnen.
Hier nochmal der Algorithmus zum nachlesen:
https://de.wikipedia.org/wiki/Größter_gemeinsamer_Teiler#Euklidischer_und_steinscher_Algorithmus
-
@Schlangenmensch Genau hab das Problem gelöst nur du hast recht ich lasse den Nutzer viel zu viel berechnen hättest du eine Idee wie man das lösen kann?
Wie soll das Programm wissen wir oft eine zahl in der anderen passt?Danke dir
-
@adii950 sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
Wie soll das Programm wissen wir oft eine zahl in der anderen passt?
int main() { int x = 13; int y = 42; std::cout << x << " passt " << (y /x) << " mal in " << y; }
"13 passt 3 mal in 42"
-
@adii950 sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
Wie soll das Programm wissen wir oft eine zahl in der anderen passt?
Ich würde das per (Ganzzahl-)Divison berechnen.
-
Oder so, wie in dem Wiki-Artikel beschrieben:
#include <iostream> using namespace std; int ggt(int z1, int z2) { if(z1 == z2) return z1; if(z1 > z2) return ggt(z1 - z2, z2); return ggt(z2 - z1, z1); } int main() { int a, b; cin >> a >> b; cout << ggt(a, b); }
-
@adii950 sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
Wie soll das Programm wissen wir oft eine zahl in der anderen passt?
Woher weißt du das denn?
-
@DirkB also du meinst doch kein Modulo Operator?
-
@Belli Lol dort ist es echt ganz easy programmiert ich hab es etwas komplizierter programmiert
aber danke dir das du den code hier reingestellt hast
-
Die Frage ist nur, ob du den klassischen Euklid oder den moderneren nehmen sollst (mit modulo statt Subtraktion): https://de.wikipedia.org/wiki/Euklidischer_Algorithmus#Moderner_euklidischer_Algorithmus
-
@adii950 sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
@DirkB also du meinst doch kein Modulo Operator?
Der berechnet den Divisionsrest.
Den meinte ich nicht.Ich meine den Operator, den du in Zeile 72 (von deinem obigen Code) verwendet hast.
-
@wob Hmm stimmt was würdest du den empfehlen?
oder soll ich beides nehmen
-
@DirkB hmm ich verstehe nicht ganz wie du das meinst könntest du bitte ein kleines bespiel geben?
-
@adii950 sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
@DirkB hmm ich verstehe nicht ganz wie du das meinst könntest du bitte ein kleines bespiel geben?
Du kannst lesen und schreiben, daher gehe ich davon aus, dass du die Grundschule besucht hast.
Erinnere dich da an das Teilen beim Rechnen.
-
Auch hübsch:
unsigned ggt(unsigned a, unsigned b) { if(b == 0) return a; return ggt(b, a % b); }
-
Es gibt auch ein
std::gcd()
, aber da muss man<numeric>
statt<cmath>
einbinden?
-
@zeropage sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
Es gibt auch ein
std::gcd()
, aber da muss man<numeric>
statt<cmath>
einbinden?Guckst du: https://en.cppreference.com/w/cpp/numeric/gcd
Es ist in
<numeric>
. Ob du<cmath>
einbindest oder nicht, ist wumpe. Ich würde daher den 2. Teil deines Satzes steichen und vielleicht ersetzen:Es gibt auch ein
std::gcd
, aber da muss man<numeric>
einbinden und mindestens C++17 zur Verfügung haben - aber die Benutzung dieser Funktion liefe der Übungsaufgabe zuwider.
-
Ja, war unklar von mir.
Deine Ersetzung liest sich besser und beschreibt auch besser, was ich ausdrücken wollte.
-
@zeropage sagte in Den ggt (Gemeinsamen Teiler) zweier Zahlen berechnen:
Deine Ersetzung liest sich besser und beschreibt auch besser, was ich ausdrücken wollte.
Ich dachte, du wolltest fragen, ob das, was du geschrieben hast, korrekt ist (da war ja ein ? am Ende).
-
Ja, war ne rethorische Frage. Weil ich hatte auch mal einen ggT benötigt, ihn auch geschrieben, meinte dann aber, STL ist immer Eigenkram vorzuziehen und hatte mich gewundert, warum man statt <cmath> <numeric> einbinden muss.
Das wollte ich mal mitteilen... wollte es aber bescheiden mit einem Fragezeichen enden lassen.