2Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
9
9
ZUGRIFFE
542
542
EMPFEHLEN
-
Hallo, ich bin Anfänger und beschäftige mich seit ein paar Tagen mit C++.

Ich will ein Programm schreiben, dass von 1-100 und danach von 1-max(Eine Zahl,die man vorher eingeben soll), alle Primzahlen errechnet und ausgibt.
Ich habe mir gedacht, dass ich erst einmal anfange indem ich ein Programm schreibe, dass mir beantwortet, ob eine Zahl,die ich eingebe, eine Primzahl ist oder nicht, weil das ja eigentlich die Grundlage für mein eigentliches Programm ist.
Ich habe folgendes geschrieben:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
#include "../../std_lib_facilities.h" #include <conio.h> // Programm,dass ausgibt, ob eingegebene Zahl Primzahl ist oder nicht int main() { int zahl; // die überprüft werden soll int teiler; cout << " Geben sie eine Zahl ein, von der Sie wissen wollen, ob es eine Primzahl ist! \n\n"; while(cin >> zahl) { if(zahl==2) cout <<" \n \n Es ist eine Primzahl \n \n"; else for(teiler=2; teiler<=(zahl-1); ++teiler) { if(zahl%teiler==0) { cout <<" \n\n Diese Zahl ist keine Primzahl \n \n" ; break; } else if(zahl%teiler!=0) { cout <<" \n\n Diese Zahl ist eine Primzahl \n \n"; break; } } } getch(); }
Nun ist mein Problem, dass mein Programm falsche Aussagen liefert : z.B.: Bei 55 gibt es aus, dass es eine Primzahl sei.
Kann mir wer helfen? Danke im Voraus
|| Eigentlich müsste man irgendwie schreiben, dass nur wenn alle Zahlen von 2 bis n-1 keine Teiler von der eingegebenen Zahl sind, eine Primzahl vorliegt. Weiß aber nicht wie (;
(denn das Programm würde z.B. rechnen 55:3 --> hat keinen Rest von 0 --> gibt aus, dass es eine Primzahl ist)Geändert von Brisingr (30.12.11 um 00:49 Uhr)
-
Hi und Willkommen bei tutorials.de,
In der Schleife gibst du ja schon beim ersten Durchgang aus, ob es eine Primzahl ist,
und beendest die Schleife dann mit break.
In der Schleife prüfst du auf Prim/nicht Prim, gibst aber nichts aus.
Wenns keine Primzahl ist, machst du ein break, sonst nicht.
Nach der Schleife überprüfst du, ob die Zählvariable ==zahl ist.
Wenn ja, ist die Schleife komplett ohne break durchgelaufen, also Primzahl.
Sonst nicht.
Guliä waíse medh ono
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Noch etwas Wichtiges: Ein logisches Und ist in C++ ein &&! Wenn du nur ein & machst, ist das ein binärer Operator, der macht etwas anderes.
Und ich vermute, dass ein kleiner Fehler in der Denkweise vorliegt: if (zahl && teiler != 0). Ich schätze einmal, du willst prüfen, ob die Zahl nicht 0 ist und ob der Teiler nicht 0 ist. Dann müsstest du nämlich schreiben: if (zahl != 0 && teiler != 0).
Wenn zahl und teiler != 0 hat eine andere Bedeutung (in deinem Fall würde es stimmen, aber ich vermute trotzdem, dass du da einen falschen Gedankengang hast) -> Wenn zahl != 0 und teiler != 0.
-
Das war wohl ein Tippfehler (% soll hin)
Aber ein einfaches else reicht auch...Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Danke erstmal für die schnellen Antworten (;
Ja, das & war nen Tipfehler von mir , da sollte eigentlich % für Rest stehen, habs geändert
Weiß nicht, ob ich das jetzt richtig verstanden habe, habe das jetzt so geändert:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
#include "../../std_lib_facilities.h" #include <conio.h> // Programm,dass ausgibt, ob eingegebene Zahl Primzahl ist oder nicht int main() { int zahl; // die überprüft werden soll int teiler; cout << " Geben sie eine Zahl ein, von der Sie wissen wollen, ob es eine Primzahl ist! \n\n"; while(cin >> zahl) { if(zahl==2) cout <<" \n \n Es ist eine Primzahl \n \n"; for(teiler=2; teiler<=(zahl-1); ++teiler) { if(zahl%teiler==0) { cout <<" \n\n Diese Zahl ist keine Primzahl \n \n" ; break; } else cout <<" \n\n Diese Zahl ist eine Primzahl \n\n"; //break entfernt } } getch(); }
Aber wenn ich jetzt z.B. 55 eingebe, gibt es aus : "
Diese Zahl ist eine Primzahl //weil das Programm bestimmt rechnet 55:2-->nich0--Primzahl
Diese Zahl ist eine Primzahl //55:3-->nich 0 --> Primzahl
Diese Zahl ist eine Primzahl // 55:4 --> nich 0 --> Primzahl
Diese Zahl ist keine Primzahl //und hier merkt es dann dass man es durch 5 teilen kann...
"
@sheel
Kannst du bitte dazu nen Quellcode einfügen?In der Schleife gibst du ja schon beim ersten Durchgang aus, ob es eine Primzahl ist,
und beendest die Schleife dann mit break.
In der Schleife prüfst du auf Prim/nicht Prim, gibst aber nichts aus.
Wenns keine Primzahl ist, machst du ein break, sonst nicht.
Nach der Schleife überprüfst du, ob die Zählvariable ==zahl ist.
Wenn ja, ist die Schleife komplett ohne break durchgelaufen, also Primzahl.
Sonst nicht.
Danke (;
-
So ist das gemeint.Code cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13
for(teiler = 2; teiler <= (zahl - 1); teiler++) { if((zahl % teiler) == 0) break; } if(teiler >= zahl) //Wenn die Schliefe bis zum Ende durchgelaufen ist, ohne break { //Primzahl } else { //Keine Primzahl }
Noch was:
Die Schleife muss nicht bis <=zahl-1 durchgehen, sondern nur bis zur Wurzel +1
(int)sqrt(zahl) + 1
Warum Wurzel?
zB. 100 ist durch 2, 4, 5, 10, 20, 25 und 50 teilbar
Wenn man bis inkl. 10 prüft, reicht das, weil:
Wenns durch 20 teilbar ist, ist 100 ja auch schon durch 5 teilbar, und stoppt schon da.
Gleich mit 25/4 und 50/2
(int) und +1 wegen der Kommastellenabschneidung.
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Ok, also das hab ich verstanden und funktioniert auch alles gut

Hinterher frag ich mich, warum ich nich selbst drauf gekomm bin (;
Hab jetzt probiert, dass so um zu schreiben, dass das Programm alle Zahlen von 1-100 testen und diese dann ausgeben soll.
Hab mir überlegt, dass ich dafür nen Vektor angelege, dann ne Variable Zahl, die immer um 1 erhöht wird, diese wird dann per Rest-Operation überprüft obs ne Primzahl ist, wenn ja wirds zum Vektor hinzugefügt und dann sollte halt die Zahlen, die im Vektor sind ausgegeben werden.
So hab ich das dann auch probiert, klappt aber nicht so wie's soll (;
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#include "../../std_lib_facilities.h" #include <conio.h> // Programm,dass alle Primzahlen von 1-100 ausgibt int main() { int zahl; // die überprüft werden soll int teiler; vector<int>prime; prime.push_back(2); int i; int size; for(zahl=1; zahl <=100; zahl++) { for(teiler = 2; teiler <=(zahl-1); teiler++) { if((zahl % teiler) == 0) break; } } if(teiler >= zahl) { prime.push_back(zahl); } size += prime.size(); for(i=0; i<size; i++) cout<<prime[i]'\n'<< } keep_window_open(); }
Könnt ihr mir da noch helfen/sagen was ich falsch gemacht hab bzw. sagen was ich verändern muss damit es funktioniert? (;
-
Hi
size steht zuerst auf irgendwas Unbekanntem, und dann addierst du prime.size() dazu.
Ergebnis: Irgendein Wert, aber nicht prime.size()
= nicht +=
Wurzel beißt nicht
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Ich wollte erst mal, dass das Programm so funktioniert und dann kann ich ja immer noch das mit der Wurzel ändern, da es ja nicht funktionswichtig ist 
Ok habe das jetzt geändert , lag aber nicht nur daran, sondern auch dass ich ne Klammer falsch gesetzt hatte (;
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#include "../../std_lib_facilities.h" #include <conio.h> // Programm,dass alle Primzahlen von 1-100 ausgibt int main() { int zahl; // die überprüft werden soll int teiler; vector<int>prime; prime.push_back(2); int i; int size; for(zahl=3; zahl <=100; zahl++) { for(teiler = 2; teiler <=(zahl-1); teiler++) { if((zahl % teiler) == 0) break; } if(teiler >= zahl) { prime.push_back(zahl); } } size = prime.size(); for(i=0; i<size; i++) cout<<prime[i]<<'\n'; getch(); }
so funktionierts
-
31.12.11 12:49 #10
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Nur mal so nebenbei, wie man Primzahlen-Faktorisierung tunen kann: Überlege dir, was die Definition einer Primzahl ist. Eine Primzahl lässt sich nur durch sich selbst oder 1 ohne Rest teilen. Das bedeutet, das man "nur" probieren muss, ob eine Zahl n durch eine vorherige ermittelte Primzahl ohne Rest teilbar ist.

Zahlentheorie, ich liebe es...
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
Ähnliche Themen
-
Primzahlen ermitteln
Von Mindxxxd im Forum C/C++Antworten: 5Letzter Beitrag: 20.11.11, 23:37 -
Ausgabe von Primzahlen, Programm läuft nicht richtig
Von orest90 im Forum C/C++Antworten: 4Letzter Beitrag: 13.11.10, 20:06 -
Primzahlen mit Programm ermitteln
Von Bertelcraft im Forum C/C++Antworten: 8Letzter Beitrag: 20.10.08, 08:28 -
Problem bei einem Programm mit Primzahlen
Von Beathoven im Forum C/C++Antworten: 5Letzter Beitrag: 02.01.08, 15:54 -
Primzahlen ermitteln
Von cotrhox im Forum PHPAntworten: 1Letzter Beitrag: 22.02.05, 17:06





Zitieren


Login






