Überprüfen auf Primzahlen
-
ja weiß ich schon, wie schreib ich das um das er mir das break erst macht wenn er alle teiler mir ausgegeben hat. ich komm da nicht weiter
-
DerAnfängerc++ schrieb:
ja weiß ich schon, wie schreib ich das um das er mir das break erst macht wenn er alle teiler mir ausgegeben hat. ich komm da nicht weiter
Lösche die Zeile mit dem '
break' doch einfach und schaue, was dann passiert ...
-
dann gibt er mir zwar alle teiler aus aber auch die letzte if abfrage....
hab schon versucht mit einer zweiten schleife aber klappt irgendwie nicht
-
Du musst dir halt merken, ob es einen Teiler gab. Mit einem Flag.
int flag = 0; ... if (zahl % teiler ==0) { flag = 1; } ... if (flag == 1) { "Die Zahl ist (k)eine Primzahl!" }
-
DerAnfängerc++ schrieb:
dann gibt er mir zwar alle teiler aus aber auch die letzte if abfrage....
hab schon versucht mit einer zweiten schleife aber klappt irgendwie nichtgut erkannt, jetzt bist Du schon einen Schritt weiter.
DirkB schrieb:
Du musst dir halt merken, ob es einen Teiler gab. Mit einem Flag.
Das wäre die Lösung, und dafür gibt es in C++ den Datentyp
bool.#include <iostream> // #include <iomanip> // ist hier nicht notwendig using namespace std; int main() { int zahl; cout << "Geben Sie eine Zahl ein: " ; cin >> zahl; bool zahl_ist_prim = true; // wir nehmen an, dass die Zahl eine Primzahl ist, bis jetzt wurde ja noch kein Teiler gefunden for (int teiler=2; teiler < zahl; teiler++) { if (zahl % teiler ==0) { cout << "Die Zahl lässt sich durch " << teiler << " teilen und ist deshalb keine Primzahl" << endl; zahl_ist_prim = false; // es existier ein Teiler, also keine Primzahl } } if(zahl_ist_prim) cout << "Die Zahl ist eine Primzahl= " << zahl; }Gruß
Werner
-
Super Danke an alle!!
-
gabs da nicht sowas, das man den teiler nicht bis zur zahl laufen lassen muss, sondern das auch die wurzel der zahl ausreicht?
also for(teiler=2;teiler<sqrt(zahl);zahl++)?
-
ACnut schrieb:
gabs da nicht sowas, das man den teiler nicht bis zur zahl laufen lassen muss, sondern das auch die wurzel der zahl ausreicht?
also for(teiler=2;teiler<sqrt(zahl);zahl++)?
Ja, man braucht auch nur alle ungerade Zahlen zu checken, nachdem man den Check durch 2 gemacht hat.
Der TE will aber alle Teiler einer Zahl finden (Gut, da braucht man auch nur bis zur Wurzel* zu gehen und das Gegenstück zu berechnen).: Wobei man sqrt noch nicht einmal braucht. Die Bedingung teilerteiler <= zahl ist wesentlich effizienter.
-
Die Bedingung teiler*teiler <= zahl ist wesentlich effizienter.
Das stimmt für große Zahlen doch nicht. Eine Million Multiplikationen? (Bzw. Eine Million Shifts mit Inkrement, nach +2n+1)
-
Nathan schrieb:
: Wobei man sqrt noch nicht einmal braucht. Die Bedingung teilerteiler <= zahl ist wesentlich effizienter.
Wenn man bis N=100 geht vielleicht.