Python Code

Neue Frage »

Auf diesen Beitrag antworten »
Kleiber Python Code

Abend Leute,

ich habe hier eine Aufgabe, an der ich jetzt seit 3h scheitere unglücklich Dabei ist es so einfach...
Ich soll einen Code bauen, in den man einen bestimmten Bereich eingibt, z.B. 1-100, und dann werden dort alle Primzahlen gesucht. Er beginnt also mit 1 und schreibt dann True für Primzahl bzw. False für keine Primzahl. Ist keine tolle Aufgabe, aber eben die Aufgabe...

Leider scheitert mein Code. Hier mein Code:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
isPrime=[]
for x in range(1,100):
	if x==0 or x==1:
		isPrime.append(x+100)
		continue
	if x==2 or x==3 or x==5:
		isPrime.append(x+200)
		continue
	if x%2==0 or x%3==0 or x%5==0:
		isPrime.append(x+300)
		continue
	for d in range(5,(x//2)+1,1):
		if x%d==0:			
			isPrime.append(x+900)
			break
	
	isPrime.append(x+500)
	
print(isPrime)
print(len(isPrime))		


Die Trues und Falses fehlen, ich habe zum Debuggen die Zahlen in Klammern. Ihr seht, dass der Code knapp scheitert, wenn ihr euch 49 anschaut. Diese Zahl taucht 2x mal auf, obwohl der Code zuerst eigentlich korrekt erkennt, dass es KEINE Prim ist unglücklich Kann jemand den Bug finden? Python3...
 
Auf diesen Beitrag antworten »
Kleiber

So, habe EINE Lösung, aber keine elegante unglücklich Geht das auch anders?

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:
isPrime=[]
for x in range(1,101):
	if x==0 or x==1:
		isPrime.append(False)
		continue
	if x==2 or x==3 or x==5:
		isPrime.append(True)
		continue
	if x%2==0 or x%3==0 or x%5==0:
		isPrime.append(False)
		continue
	l=0	
	for d in range(5,int(x**0.5)+1,2):
		if x%d==0:
			
			isPrime.append(False)
			l=1
			break
		continue	
	
	if l==0:	
		isPrime.append(True)
	
print(isPrime)
print(len(isPrime))		
Auf diesen Beitrag antworten »
eulerscheZahl

So würde ich es machen:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
def isPrime(n):
	if (n < 2): return False
	i = 2
	while (i*i <= n):
		if n%i == 0: return False
		i += 1
	return True

start = int(raw_input("Startwert: "))
end = int(raw_input("Endwert: "))
for i in range(start, end+1):
	print isPrime(i)

Beachte, dass du mit den Teilern nur bis sqrt(n) gehen musst, nicht bis n/2
Auf diesen Beitrag antworten »
ed209

Hi Kleiber,

Ich verstehe Deine Loesung ueberhaupt nicht. Kannst Du uns vielleicht erklaeren wie sie funktionieren soll und wir koennen dann schauen ob Du eventuell irgendwo einen Denkfehler oder einen Programmierfehler hast.

Gruss,
ED
 
Auf diesen Beitrag antworten »
eulerscheZahl

Kleiber schreibst zunächst für jede Zahl im Bereich 1-100 entweder True oder False in die Liste, je nachdem ob sie prim ist oder nicht.
Wenn die Zahl 0 oder 1 ist, ist sie offensichtlich nicht Prim, also schreibe False in die Liste
Die Zahlen 2, 3 und 5 sind Primzahlen, in dem Fall schreibe True
Trifft das nicht zu, ist die Zahl aber Vielfaches von 2, 3 oder 5, ist sie nicht prim, also schreibe False in die Liste
Hat nicht von alledem zugetroffen: gehe von 5 aus in 2er Schritten bis bis n/2 (aufgerundet) und führe eine Probedivision durch

Hier der Code von Kleiber nochmal leicht modifiziert:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
isPrime=[]
for x in range(1,101):
	if x==0 or x==1:
		isPrime.append(False)
	elif x==2 or x==3 or x==5:
		isPrime.append(True)
	elif x%2==0 or x%3==0 or x%5==0:
		isPrime.append(False)
	else:
		noDivisors = True
		for d in range(5,x//2+1,2):
			if x%d==0:
				noDivisors = False
				break
		isPrime.append(noDivisors)
	
print(isPrime)
print(len(isPrime))
Auf diesen Beitrag antworten »
Kleiber

Danke an alle für die Hinweise. Euler hat meine Lösungsidee dann nochmal verbessert, sieht so besser aus Augenzwinkern
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »