primzahl ermitteln
-
Keinen Fehler, sondern einen Verbesserungsvorschlag:
2 ist die einzige gerade Primzahl. Also kannst du am Anfang einmal %2 rechnen und dann in deiner Schleife i immer um 2 erhöhen. Das spart ein wenig an Rechenzeit (obwohl man das heute nur bei großen Zahlenräumen merkt). Ich würde mir diese Vorgehensweise aber angewöhnen.
-
du setzt primzahl zwar auf false, aber nie wieder auf true
-
Desweiteren musst du afaik nur bis sqrt(stop) laufen.
-
Außerdem solltest du den Test, ob primzahl == false ist, erst machen NACHDEM die innere Schleife komplett durchlaufen ist, sonst gibt er einfach nur bei jedem Teiler aus ob die Zahl dadurch teilbar ist oder nicht.
-
Desweiteren musst du afaik nur bis sqrt(stop) laufen.
hä?
Außerdem solltest du den Test, ob primzahl == false ist, erst machen NACHDEM die innere Schleife komplett durchlaufen ist, sonst gibt er einfach nur bei jedem Teiler aus ob die Zahl dadurch teilbar ist oder nicht.
hab ich,aber ändert nichts!
ich habe das problem gefunden,weiss aber nicht wie ich es berichtigen soll:
wenn die bool variable einmal auf false gesetzt ist(also er hat erkannt das zB 4 keine primzahl ist),dann lässt sich diese variable nicht mehr auf true setzen,da der rest nie null sein kann.
weiss einer wie mans regeln kann.
-
ok habe den fehler gefunden,danke nochmal
-
wanderameise schrieb:
Desweiteren musst du afaik nur bis sqrt(stop) laufen.
hä?
Er meint, dass du abbrechen kannst, wenn i größer ist als die Wurzel von j. Denn alle Zahlen über der Wurzel von j, die Teiler von j sind, hast du schon mit kleineren Zahlen abgedeckt.
Beispiel: j=57
Dann brauchst du nicht zu fragen, ob 57 durch 19 teilbar ist, weil es auch durch 3 teilbar ist, was du schon vorher testest.
-
Mit Optimierungen sieht das dann ungefähr so aus
#include <iostream> using namespace std; int main() { int start,stop,j,i; bool primzahl=true; cout << "geben sie einen startwert ein" << endl; cin >> start; cout << "geben sie einen endwert ein" << endl; cin >> stop; if(start<=2) { cout << "2 ist eine Primzahl." << endl; start=3; } for (j=start+1-(start%2);j<=stop;j+=2) { primzahl=true; for(i=2;i*i<=j;i++) { if (j%i==0) { primzahl=false; break; } } if(primzahl) cout << j << " ist eine Primzahl." << endl; } system("PAUSE"); return 0; }
-
Also ich hatte das selbe problem, ich geb dir mal meinen funktionierenden code, hoffe du kannst was damit anfangen...
Aber ich habe anstatt for-schleifen -> while schleifen benutzt.
#include <stdio.h> #include <iostream.h> int main(int argc, char *argv[]) { int EndZahl,a=1,b=2; cout<<"Gib die EndZahl ein: "<<endl; cin>>EndZahl; while(a!=EndZahl+1) { bool prim=true; b=2; while(b<a) { if(a%b==0) { prim=false; break; }; ++b; }; if(prim) cout<<a; ++a; }; return 0; }
Cu DFK
-
Hi,
der Code von DrZoidberg ist allerdings schneller, weil da nur jede 2.Zahl überprüft wird.
@DrZoik: was bedeudet eigentlich エ ク ス ト リ ー ム プ ロ グ ラ ミ ン グ ?