Teilbarkeit in c/c++?
Hi zusammen... Ich möchte ein kleines c/c++ programm schreiben, dass alle primzahlen bis zu einer vom benutzer definierten zahl ermittelt.(z.B. Integer "blablabla".) dann habe ich folgebdes problem. Wie kann ich abfragen ob 7/4 teilbar ist? Also z.B. (Y = aktuelle zahl, von der ermittelt werden soll, ob es sich um eine primzahl handel anfangs 1, x=teilbarkeitstest zahl anfangs 2) { goto start: Jeey: Y++; Yoyo: Start: If (x(nicht teilbar durch) y) { X++; If (x=y) {cout << x; goto jeey;} goto yoyo: } Eigentlich gehts ja nur um den teilbarkeitsbefehl im rest hats jetzt sicher tausende fehler:D aberes geht um das teilbar durch.
5 Antworten
Folgender Source-Code wurde mit codeblocks 13.12 geschrieben auf Suse Linux 13.1 besser dargestellt im www.programmierer-forum.de unter c++
includeusing namespace std;
int primtest( unsigned long nummer) { unsigned long slei, a, c, e; e = 0; a = (nummer / 2) + 2; for(slei = 2; slei <= a; slei+= 1) { c = nummer % slei; if(c == 0) e++; } if (e == 0) e = 1; return e; }
void teilbarkeit(unsigned long zahl) { unsigned long slei, c, e; cout << endl << "Zahl teilbar durch " << endl; for(slei = 2; slei <= zahl; slei++) { c = zahl % slei; if(c == 0) { cout << slei << " "; e = primtest(slei); if (e == 1) cout << "(Primzahl) "; } } }
void Probe (unsigned long faktoren[], unsigned long d) { unsigned long zahl, slei;
cout << endl << "Probe: " << endl; cout << "Zahl der Faktoren: " << d << endl;
for ( slei = 0; slei < d; slei++) cout << endl << slei +1 << ". ter Faktor " << " = " << faktoren[slei] ; cout << endl;
zahl = 1; for ( slei = 0; slei < d; slei++) { cout << faktoren[slei] ; if (slei < d - 1) cout << "*";
zahl = faktoren[slei]; } cout << "=" << zahl << endl << "Zahl wurde berechnet"; } unsigned long Faktorentest(unsigned long zahl, unsigned long (faktoren)[100]) { unsigned long slei, sleib, a, b, c, d, e;
a = zahl;
b = 0;
d = 0;
e = 0;
for (slei= 2; slei <= ((zahl / 2) + 2); slei++)
{
c = primtest(slei);
if (c == 1)
{
for (sleib = 2; sleib <= 25; sleib++)
{
b = a / slei;
d = a % slei;
if (d) break;
cout << endl << "b = a / slei: " << b << " = " << a << "/ " << slei << "(primzahl)";
(*faktoren)[e++] = slei;
a = b;
if (b == 1) goto fertig;
}
}
}
fertig: return e; } int main(void) { unsigned long zahl, c, e, faktoren[100]; char frage;
eingabe: cout << endl << "Primfaktorenrechner:"; cout << endl << "Bitte eine Zahl eingeben: "; cin >> zahl; c = primtest(zahl); if(c == 1) { cout << endl <<" Zahl ist selber Primzahl: " << c; goto frage; }
cout << endl << "Weiter mit berechnen" << endl;
teilbarkeit(zahl); e = Faktorentest(zahl, &faktoren);
Probe (faktoren, e);
frage: cout << endl << "nocheinmal(j/n): "; cin >> frage; if (frage == 'j') goto eingabe;
cout << endl << "Programmende" ; }
Zuerstmal: Keine gotos verwenden! Zumindest nicht als Anfänger, das ist schlechter Stil.
Zur eigentlichen Frage:
if(7 % 4 == 0)
cout << "teilbar!";
else
cout << "nicht teilbar";
Ich hab da mal einen Satz gelesen, den fand ich ganz passend. Bekomme ihn leider nicht mehr zusammen, aber sinngemäß war er: Schlechte Programmierer verwenden häufig gotos, gute Programmierer verwenden niemals gotos, ausgezeichnete Programmierer erkennen, wann sie geeignet sind.
Ich denke gotos können (!) eine elegante Lösung sein, allerdings nur in äußerst seltenen Fällen - und diese Fälle muss man eben in der Lage sein erkennen zu können, deswegen macht meist mehr Sinn ganz darauf zu verzichten
... Ich hoffe erstmal das mit "goto" ist nicht wörtlich gemeint. goto befehle sollten immer vermieden werden und gerade als Anfänger solltest du die finger davon lieber ganz lassen. Die meisten goto's lassen sich aber auch problemlos zbs. durch schleifen ersetzen.
Zu deinem Problem:
Das Schlüsselwort heißt modulo bzw. rest. Unter C++ mit "%" ausgedrückt. dh. zbs.:
9%9==rest 0
9%8==rest 1
Du brauchst also nur abzuprüfen ob der Rest == 0 ist. Zbs. so:
if((Zahl % Teiler)==0)
//Zahl ist teilbar.
else
//Zahl ist nicht teilbar.
Zahl ist natürlich die Zahl welche du prüfen willst und Teiler der Teiler auf Welchen Geprüft werden soll.
LG SK
Genau das habe ich gemeint! Danke. Das mit den ganzen gotos war hingekackt ich hatte keine zeit um hier einen quellcode hinzustampfen :D
Danke an alle! ich hab jetzt einene simplen code: #include
includeusing namespace std;
int main(int argc, char *argv[]) { int Biszu, Zahl = 4, momentan = 2; cout << "Bis zu welcher Zahl sollen die Primzahlen berechnet werden? "; cin >> Biszu; cout << "Die Primzahlen bis " << Biszu << " sind:" << endl;
while (momentan < Zahl) { while (Zahl <= Biszu) { while ((Zahl % momentan) != 0)
momentan++;
if (momentan == Zahl) cout << Zahl << ", ";
Zahl++;
momentan = 2;
}}
cout << "2," << Zahl << ", ";
system("PAUSE");
return EXIT_SUCCESS;
}
habt ihr noch tipps?
Über modulo, das gibt dir den Rest der Division raus glaub ich.
Musste mal googlen.
Fortgeschrittene und Profis sollten auch auf goto verzichten. :)