Primzahlen mit Programm ermitteln

Brisingr

Grünschnabel
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:
#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)
 
Zuletzt bearbeitet:
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 :D
 
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.
 
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:
#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
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.

Kannst du bitte dazu nen Quellcode einfügen?
Danke (;
 
C++:
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
}
So ist das gemeint.

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ß
 
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:
#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 :)
 
:D 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:
#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 ;)
 
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... :)
 
Zurück