11 svar
644 visningar
leksson behöver inte mer hjälp
leksson 21
Postad: 9 nov 2021 21:42 Redigerad: 9 nov 2021 21:50

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()

Laguna Online 30472
Postad: 9 nov 2021 21:46

Vilka x har du provat?

leksson 21
Postad: 9 nov 2021 21:48 Redigerad: 9 nov 2021 21:51

Det fungerade för 1 och för 2, för x=5 får jag ingen print.

Laguna Online 30472
Postad: 9 nov 2021 21:53

För x = 5 är iz = 2, och range(2,2) blir inget. Du får använda range(2,iz+1).

leksson 21
Postad: 9 nov 2021 21:56 Redigerad: 9 nov 2021 21:56
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

Laguna Online 30472
Postad: 9 nov 2021 22:00

9 är delbart med 3 men inte med 2.

CurtJ 1201
Postad: 9 nov 2021 23:02 Redigerad: 9 nov 2021 23:29

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()

CurtJ 1201
Postad: 9 nov 2021 23:29 Redigerad: 9 nov 2021 23:31

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

leksson 21
Postad: 10 nov 2021 10:46 Redigerad: 10 nov 2021 10:47

 Ja, såg också att jag missat 2an!

Lindehaven 820 – Lärare
Postad: 10 nov 2021 17:47

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.")
Laguna Online 30472
Postad: 10 nov 2021 17:56

Hur går det med 4?

Lindehaven 820 – Lärare
Postad: 10 nov 2021 19:07

Då lägger man till en test för det ...

assert isprime(4) == False

... och börjar söka felet :-)

Svara
Close