Kolla om det är ett primtal
Hej! Ska skriva ett program som kollar ifall användarens input x, är ett primtal, men förstår inte vad jag gör för fel då inget printas för x större än 2. Detta är hur jag gjort.
import math
def prime():
x=eval(input("x: "))
z=math.sqrt(x)
iz=int(z)
if x<2:
print("x är inte ett primtal")
if x==2:
print("x är inte ett primtal")
for i in range(2,iz):
if x%i==0:
print("x är inte ett primtal")
else:
print("x är ett primtal")
prime()
Vilka x har du provat?
Det fungerade för 1 och för 2, för x=5 får jag ingen print.
För x = 5 är iz = 2, och range(2,2) blir inget. Du får använda range(2,iz+1).
Laguna skrev:För x = 5 är iz = 2, och range(2,2) blir inget. Du får använda range(2,iz+1).
Ja! Okej! Detta för att jag gjort det till en int alltså.
Provade med detta nu och för x=9 uppfyller det tydligen både min if och else sats, då jag får både "x är ett primtal och "x är inte ett primtal
9 är delbart med 3 men inte med 2.
Mina kommentarer i din kod och mitt förslag nedanför. Titta och jämför och se vad som skiljer med hjälp av mina kommentarer.
import math
def prime():
x=eval(input("x: "))
z=math.sqrt(x)
iz=int(z)
# Du kan slå ihop den här kontrollen med nästa .. if x<=2
if x<2:
print("x är inte ett primtal")
if x==2:
print("x är inte ett primtal")
# Obs iz (övre gräns) ingår inte i range'en. Lägg till 1 om du vill ha med den
for i in range(2,iz):
if x%i==0:
# Om det här villkoret är sant vill du inte göra fler kontroller
# Skriv ut och lämna funktionen
print("x är inte ett primtal")
else:
# Den här koden körs för varje gång en division inte går jämnt ut
# Du vill nog bara köra den när alla värden i rangen använts
print("x är ett primtal")
prime()
Mitt förslag till lösning
import math
def prime():
# Läs in värdet
x=eval(input("x: "))
# Beräkna heltalsvärdet av kvadratroten ur värdet
z=math.sqrt(x)
iz=int(z)
# 0,1 är inte primtal per defintion
if x<2:
print("x är inte ett primtal")
return
# Kontrollera alla tal från 2 till och med iz
# Går division av x jämt ut är det inte ett primtal
# och vi kan sluta kontrollera och lämna funktionen
for i in range(2,iz+1):
if x%i==0:
print("Ej primtal")
return
# Kommer du hit är det ett primtal
print("Primtal")
prime()
Jag rättade föregående. 2 ÄR ett primtal. Fel av mig
Ska man va noggrann ska man också kontrollera inmatningen så att det verklgien är ett heltal som är större än 0
Ja, såg också att jag missat 2an!
Man bör skriva funktioner så de kan återanvändas och så att man slipper sitta vid tangentbordet för att testa. Undvik därför input()
och print()
i funktionerna.
def isprime(x):
if not isinstance(x, int) or x < 2:
return False
iz = int(x**0.5) + 1
for i in range(3, iz, 2):
if x%i == 0:
return False
return True
if __name__ == "__main__":
x = int(input("x: "))
if isprime(x):
print("Primtal")
else:
print("Ej primtal")
Ett snabbt och enkelt sätt att automatisera testerna (om modulen ovan heter primtal
):
from primtal import isprime
assert isprime(-1) == False
assert isprime(0) == False
assert isprime(1) == False
assert isprime(2) == True
assert isprime(2.0) == False
assert isprime(3) == True
assert isprime(3.0) == False
assert isprime(79) == True
assert isprime(81) == False
assert isprime(83) == True
assert isprime(991) == True
assert isprime(993) == False
assert isprime(995) == False
assert isprime(997) == True
print("All tests OK.")
Hur går det med 4?
Då lägger man till en test för det ...
assert isprime(4) == False
... och börjar söka felet :-)