Überprüfung ob Zahl cin Primzahl ist oder nicht Erledigt
-
volkard schrieb:
Alle Wege führen zu einer von Dir eigens dafür geschriebenen Funktion
bool istPrimzahl(int kandidat)
Sobald Du das geschafft hast, können Wir Dein Programm supi hübsch znd elegant machen. Aber dann kannste es auch selber.Darf keine Funktionen verwenden aber danke für den Hinweis
lg
markus
-
Wer sagt das? Und was ist der Sinn dahinter?
PS: Selbst wenn du im fertigen Programm keine Funktion verwenden darfst/willst, solltest du den Primzahltest trotzdem erstmal für sich alleine auf die Beine stellen. Wenn du dann unbedingt die Vorgaben deines Profesors erfüllen mußt, kopierst du ihn halt direkt ins Hauptprogramm.
-
markuswenczel schrieb:
Es funktioniert
Glaub ich nicht, Deinem Programm zufolge ist 15 eine Primzahl ...
-
Wenn ich das richtig verstehe, prüft Dein Programm die eingebene Zahl lediglich auf Modulo 2, d.h., ob die Zahl gerade oder ungerade ist.
Es gibt aber auch viele ungerade Zahlen, die keine Primzahlen sind.
Eine %2-Prüfung ist eigentlich gar nicht notwendig, man kann z.B. die geraden Zahlen mit Ausnahme von 2 von vornherein ausschließen, in dem man mit einer Schleife beginnend mit 3 arbeitet, die dann immer um 2 hochzählt.
-
Noch ein Vorschlag, es besser zu machen:
bool is_prime(unsigned n) { if(n == 2 || n == 3) return true; if(n < 2 || n % 2 == 0 || n % 3 == 0) return false; for(unsigned i = 5, delta = 2; i * i < n; i += delta, delta = 6 - delta) if(n % i == 0) return false; return true; }Hier wird auf i abwechselnd 2 und 4 addiert, wodurch die Schleife noch weniger durchlaufen wird.
Hier mit Ausgabe: http://ideone.com/oQheK
-
danke habe das mal versucht funktioniert aber nicht
siehe meinen Code hmmmmmmmm314159265358979 schrieb:
Noch ein Vorschlag, es besser zu machen:
bool is_prime(unsigned n) { if(n == 2 || n == 3) return true; if(n < 2 || n % 2 == 0 || n % 3 == 0) return false; for(unsigned i = 5, delta = 2; i * i < n; i += delta, delta = 6 - delta) if(n % i == 0) return false; return true; }Hier wird auf i abwechselnd 2 und 4 addiert, wodurch die Schleife noch weniger durchlaufen wird.
Hier mit Ausgabe: http://ideone.com/oQheK
-
Natürlich funktioniert das.
-
markuswenczel schrieb:
Funzt nicht warum wohl hmmmmmmmmm
for(unsigned i = 5, h = 2; i * i < zahl; i += h, h = 6 - h) { if(zahl % i == 0) cout<<"Ist Keine Primzahl"<<endl; else { cout<<"Ist eine Primzahl"<<endl;}Wenn ich die Schleife richtig verstehe, soll sie solange laufen, wie i*i kleiner als die eingebene Zahl ist.
Im ersten Durchlauf ist i*i immer 25, bei jeder eingegebenen Zahl<25 wird die Schleife sofort verlassen. (Ausnahme nur wenn %2,3 == 0 ist.)
i wird nach jedem Schleifendurchlauf um 4 erhöht, also 5,9,13,17,21,25,
die Modulorechnungen dazwischen finden aber nicht statt, was sie aber zumindest teilweise müßten.
-
i wird immer abwechselnd um 2 und 4 erhöht. Daher ergeben sich für i die Werte:
5, 7, 11, 13, 17, 19, 23, 25, 29, ...
-
314159265358979 schrieb:
i wird immer abwechselnd um 2 und 4 erhöht. Daher ergeben sich für i die Werte:
5, 7, 11, 13, 17, 19, 23, 25, 29, ...Stimmt.
-
314159265358979 schrieb:
Noch ein Vorschlag, es besser zu machen:
bool is_prime(unsigned n) { if(n == 2 || n == 3) return true; if(n < 2 || n % 2 == 0 || n % 3 == 0) return false; for(unsigned i = 5, delta = 2; i * i < n; i += delta, delta = 6 - delta) if(n % i == 0) return false; return true; }Hier wird auf i abwechselnd 2 und 4 addiert, wodurch die Schleife noch weniger durchlaufen wird.
Hier mit Ausgabe: http://ideone.com/oQheK
Hmm, die Ausgabe geht nur bis 24. Absicht? Wolltest Du da etwas vertuschen?
-
Das is_prime() scheint Quadratzahlen aber sehr zu mögen.

-
volkard schrieb:
314159265358979 schrieb:
Noch ein Vorschlag, es besser zu machen:
bool is_prime(unsigned n) { if(n == 2 || n == 3) return true; if(n < 2 || n % 2 == 0 || n % 3 == 0) return false; for(unsigned i = 5, delta = 2; i * i < n; i += delta, delta = 6 - delta) if(n % i == 0) return false; return true; }Hier wird auf i abwechselnd 2 und 4 addiert, wodurch die Schleife noch weniger durchlaufen wird.
Hier mit Ausgabe: http://ideone.com/oQheK
Hmm, die Ausgabe geht nur bis 24. Absicht? Wolltest Du da etwas vertuschen?
Nein. 25 ist eine schöne Zahl für eine Schleifenbedingung. Ich hätte mindestens bis 100 gehen sollen.
cooky451 schrieb:
Das is_prime() scheint Quadratzahlen aber sehr zu mögen.

Sollte natürlich <= als Schleifenbedingung hin

Hier nochmal korrigiert und alle Primzahlen unter 100: http://ideone.com/YotE7

-
redrew99 schrieb:
markuswenczel schrieb:
Funzt nicht warum wohl hmmmmmmmmm
for(unsigned i = 5, h = 2; i * i < zahl; i += h, h = 6 - h) { if(zahl % i == 0) cout<<"Ist Keine Primzahl"<<endl; else { cout<<"Ist eine Primzahl"<<endl;}Wenn ich die Schleife richtig verstehe, soll sie solange laufen, wie i*i kleiner als die eingebene Zahl ist.
Im ersten Durchlauf ist i*i immer 25, bei jeder eingegebenen Zahl<25 wird die Schleife sofort verlassen. (Ausnahme nur wenn %2,3 == 0 ist.)
i wird nach jedem Schleifendurchlauf um 4 erhöht, also 5,9,13,17,21,25,
die Modulorechnungen dazwischen finden aber nicht statt, was sie aber zumindest teilweise müßten.Stimmt danke für den Hinweis
Ich könnte mit Modulo überprüfen ob die Zahl durch 2.3.4 usw teilbar ist
aber nur wenn sei durch sich selbst und ein teilbar ist ist das Ergebnis true
klingt so einfach aber wie baue ich das in eine Schleife ein

-
markuswenczel schrieb:
klingt so einfach aber wie baue ich das in eine Schleife ein
Na PI's version ist schon etwas tricky, hier mal eine einfachere Überlegung:
bool is_prime(unsigned val) { if (val > 1) // 1 ist keine Primzahl! { for (unsigned i = 2; i < val; ++i) // von 2 bis (Wert-1) if (val % i == 0) // Muss immer ein Rest bleiben return false; return true; // Dann ist es eine Primzahl } return false; }
-
cooky451 schrieb:
markuswenczel schrieb:
klingt so einfach aber wie baue ich das in eine Schleife ein
Na PI's version ist schon etwas tricky, hier mal eine einfachere Überlegung:
bool is_prime(unsigned val) { if (val > 1) // 1 ist keine Primzahl! { for (unsigned i = 2; i < val; ++i) // von 2 bis (Wert-1) if (val % i == 0) // Muss immer ein Rest bleiben return false; return true; // Dann ist es eine Primzahl } return false; }Mein Versuch scheitert bitte warum
#include <iostream> using namespace std; int main(){ char c; do{ int s,zahl,h; cout<<"Bitte positiven Startwert eingeben"<<endl; cin>>zahl; if(zahl>1){ for(int i=2;i<zahl;++i) if(zahl%i==0){ cout<<"Ist Keine Primzahl"<<endl;} } cout<<"Ist Eine Primzahl"<<endl; cout<<"Nochmal==='j'/Abbruch==='n'"<<endl; cin>>c; }while(c=='j'); }
-
Der Unterschied zu Cookys Version ist, daß er bei einem "Treffer" komplett aus der Funktion herausspringt. Wenn du es wirklich direkt in die Hauptfunktion einbauen willst, mußt du dir auf andere Weise merken, ob du einen Teiler gefunden hast.
PS: Tu uns einen Gefallen und gewöhn dir einen ordentlichen Einrückungsstil an.
-
Die Definition von s und h dürfte überflüssig sein, die Variablen werden nicht benötigt.