004
16.12.2005, 15:59 Uhr
~Aconcagua
Gast
|
Leider fehlerhaft, z. B. wird 169 als Primzahl erkannt:
Testzahlen: i = 3, j = 2 i = 5, j = 4 i = 9, j = 2 i = 11, j = 4 (!)
jetzt wird die 13 übersprungen...
Abwechselnd +2, +4 führt immer wieder dazu, dass Primzahlen übersprungen werden, auch wenn man zuerst +4 ausführt.
Ganz nebenbei hätte man mit i = 11 beginnen können, da die kleineren Primzahlen bereits in der if-Anweisung abgeprüft wurden.
Unschön ist noch, dass die 1 als Primzahl erkannt wird, die aber keine ist.
So sollte es klappen:
[cpp] bool isprime(unsigned x) { if(x == 2 || x == 3) return true if(x < 2 || x % 2 == 0) return false;
for(unsigned i = 3; i*i <= x; i += 2) while(i*i <= x) { if(x % i == 0) return false; i += 2; } [/cpp]
Das ganze ist allerdings überaus ineffizient (gib mal recht große Zahlen ein...), in entsprechender Fachliteratur findet man wesentlich bessere Algorithmen (z. B. Cormen, Leiserson, Rivest: Introduction to Algorithms, auch auf dt. erhältlich). |