Gå til innhold

Lage et program for å finne primtallsfaktorer.


Anbefalte innlegg

Hei.

Har jobba ei stund med ei innleveringsoppgave som lyder som følger: 

Lage et program som etterspør et positivt heltall større enn
 1 som input, og skriver ut det største og det minste primtallfaktoren 
 til tallet. Bortsett fra når en av primtallsfaktorene er 
 3, 13, 113, 313 eller 613, da skal det bare skrives ut at det er 
 et "Tommytall"

Jeg har laget et program som finner største og minste primtallsfaktor, men sliter med å få det til å skrive ut "Tommytall". Altså siste del av oppgaveteksten. Prøvde å legge ved .py-fila, men fikk feilmelding. Tok derfor screenshot og la ved. 

 

Noen som har veiledning å gi meg?

image.png

Lenke til kommentar
Videoannonse
Annonse

Lag en funksjon som verifiserer input, bruk en switch(tror det heter match i python?) der en først sjekker at input =< 1, om så må den returnere at det var feil input da det skal være > 1. Så lager du caser for alle tommy tall der den returnerer tommy tall. og til slutt kjører du funksjonene dine om det er valid input. 

 

EDIT: ser jeg leste litt dårlig. Du må først sjekke at input > 1, så kjøre primtall beregningene. Så kjøre en switch for de tallene som skal skrive ut tommy tall og en default som skriver primtallene. Håper det var forståelig.

Endret av Salvesen.
Lenke til kommentar
Salvesen. skrev (1 time siden):

Lag en funksjon som verifiserer input, bruk en switch(tror det heter match i python?) der en først sjekker at input =< 1, om så må den returnere at det var feil input da det skal være > 1. Så lager du caser for alle tommy tall der den returnerer tommy tall. og til slutt kjører du funksjonene dine om det er valid input. 

 

EDIT: ser jeg leste litt dårlig. Du må først sjekke at input > 1, så kjøre primtall beregningene. Så kjøre en switch for de tallene som skal skrive ut tommy tall og en default som skriver primtallene. Håper det var forståelig.

Takk for svar! Ser at det jeg sliter mest med er den grunnleggende oppbyggingen mtp rekkefølge og innrykk. Blir fort knot når jeg setter det opp, og MYE feilsøking. Skal prøve litt til på det du skrev, men har aldri brukt switch før så tar nok litt tid 😉

Lenke til kommentar
ksgylja skrev (14 minutter siden):

Takk for svar! Ser at det jeg sliter mest med er den grunnleggende oppbyggingen mtp rekkefølge og innrykk. Blir fort knot når jeg setter det opp, og MYE feilsøking. Skal prøve litt til på det du skrev, men har aldri brukt switch før så tar nok litt tid 😉

lenge siden jeg har brukt python, går mest i c# men ved google søk ser det ut til at swtich gjøres slik:

 

match value:
    case condition:
        action(s)

 

Så en funksjon for tommy tall kunne blitt noe slik:

def tommyTall(nummer)
  match nummer:
      case 3:
          return "Tommy tall"
      case 13:
          return "Tommy tall"
osv

EDIT: du kan jo returnere ett flag også, og så lage kode for å enten skrive ut tommy tall eller primtall, litt opp til hvordan du legger det opp. Men håper oppbyggingen er forståelig :) Kan jo droppe switch og bruke if elseif og else men jeg synes det fort blir rotete når en skal sjekke så mye. da liker jeg switch :)

Endret av Salvesen.
Lenke til kommentar
Salvesen. skrev (På 16.5.2022 den 14.01):

lenge siden jeg har brukt python, går mest i c# men ved google søk ser det ut til at swtich gjøres slik:

 


match value:
    case condition:
        action(s)

 

Så en funksjon for tommy tall kunne blitt noe slik:


def tommyTall(nummer)
  match nummer:
      case 3:
          return "Tommy tall"
      case 13:
          return "Tommy tall"
osv

EDIT: du kan jo returnere ett flag også, og så lage kode for å enten skrive ut tommy tall eller primtall, litt opp til hvordan du legger det opp. Men håper oppbyggingen er forståelig :) Kan jo droppe switch og bruke if elseif og else men jeg synes det fort blir rotete når en skal sjekke så mye. da liker jeg switch :)

Tusen takk for innspillene. Jeg har rotet veldig med å prøve ut ulike scenarier, men programmet kjører ikke slik jeg hadde tenkt. Mistenker at jeg ikke setter ting med riktig innrykk, eller feil sjekk av de ulike variablene. Ser at det går greit å sjekke om brukeren legger inn et tall større enn 1 og at det da kjører, men når jeg legger inn at det skal printes ut at man må taste et tall større enn 1, så klarer jeg ikke å stoppe programmet. Har prøvd quit(), men får bare feilmelding. Og "break" mener jeg bare kan stoppe en løkke? Og når jeg legger inn at dersom bruker legger inn et av "Tommytallene" så sjekker den likevel minste og største faktor. Vil jo ha det slik at det ikke gjør mer enn å skrive ut at det er et tommytall dersom bruker legger inn et slikt, men og at det sjekker de ulike faktorene slik at uansett om det er minste, største eller en hvilken som helst av faktorene så skriver den ut at det er et Tommytall, og så avslutter programmet. Tok forresten bort semikolon på slutten av return-setningene på minsteFaktor, -gjør det noe?

image.thumb.png.a78ff20221beb0ee98442a95a791c896.png

image.png

Lenke til kommentar
if(nummer=3 or nummer=13 or nummer=113 or nummer=313 or nummer=613):
  print("tommy tall)
elif(nummer<=1):
  print("Tall må være større enn 1)
else:
  print("miste: " + minsteFaktor(nummer))
  print("Største: " + storsteFaktor(nummer))
def minsteFaktor(n):
  #tilhørende kode
  
def storsteFaktor(n):
  #tilhørende kode

her er ett eksempel. Dette vill kjøre en gang og stoppe. Om du vill at de taster på ny om de legger inn feil må du ha med en løkke.

Lenke til kommentar
Salvesen. skrev (4 minutter siden):

if(nummer=3 or nummer=13 or nummer=113 or nummer=313 or nummer=613):
  print("tommy tall)
elif(nummer<=1):
  print("Tall må være større enn 1)
else:
  print("miste: " + minsteFaktor(nummer))
  print("Største: " + storsteFaktor(nummer))
def minsteFaktor(n):
  #tilhørende kode
  
def storsteFaktor(n):
  #tilhørende kode

her er ett eksempel. Dette vill kjøre en gang og stoppe. Om du vill at de taster på ny om de legger inn feil må du ha med en løkke.

Skal prøve, -TAKK! 😄

Lenke til kommentar
ksgylja skrev (21 timer siden):

Skal prøve, -TAKK! 😄

Da fikk jeg ordnet alt.Tusen takk for god hjelp! ❤️

#importerer math-modulen
import math
#ber om et tall større enn 1 fra bruker
n = int(input("Skriv et positivt heltall som er større enn 1:"))

#funksjon for å finne minste primtallsfaktor
def minsteFaktor(n):
     #Hvis delelig med 2 returnerer denne faktoren 2
     #som jo da er den minste
     if (n % 2 == 0):
         return 2
 

     # repetérer fra 3 til kvadratrot(n)
     i = 3;
     while(i * i <= n):
         if (n % i == 0):
             return i;
         i += 2;
     return n;

#funksjon for å finne største primtallsfaktor
def storsteFaktor(n):
      # Initiere den største faktoren
     # variabel med den laveste
     maxPrimtall = -1
     
     # finn antallet 2'ere som dividerer n
     while n % 2 == 0:
         maxPrimtall = 2
         n >>= 1     # ekvivalent til n /= 2
         
     
     for i in range(3, int(math.sqrt(n)) + 1, 2):
         while n % i == 0:
             maxPrimtall = i
             n = n / i
     
     # Denne er for å takle dersom n
     # er et  primtall større enn 2
     if n > 2:
         maxPrimtall = n
         return int(maxPrimtall)           
#sjekker om bruker legger inn et tommytall og gir tilbakemelding på det 
if(n==3 or n==13 or n==113 or n==313 or n==613):
  print("Tommytall")

#legger inn betingelsen at bruker må legge inn et tall som er større enn 1
elif(n<=1):
  print("Tallet må være større enn 1")

#sjekker om minste faktor er et av tommytallene
elif minsteFaktor(n)==3 or minsteFaktor(n)==13 or minsteFaktor(n)==113 or minsteFaktor(n)==313 or minsteFaktor(n)==613:
    print("Tommytall")

#sjekker om største faktor er et av tommytallene
elif storsteFaktor(n)==3 or storsteFaktor(n)==13 or storsteFaktor(n)==113 or storsteFaktor(n)==313 or storsteFaktor(n)==613:
    print("Tommytall")

#dersom de ovenstående vilkårene ikke er gjeldende så skriver man ut største og minste faktor
else:
   print("minste: " , minsteFaktor(n))
   print("Største: " , storsteFaktor(n))

#kaller opp de to funksjonene
minsteFaktor(n)
storsteFaktor(n)  

image.png

Endret av ksgylja
Fikk den til!
Lenke til kommentar
ksgylja skrev (10 minutter siden):

Satte opp den nye koden, litt endring finpuss og den fungerer bra når bruker legger inn et av de gitte tallene. Problemet blir at dersom man legger inn 26, som jo blir 2*13, så printer den ut 2 som minste faktor, og 13 som største. Slik jeg har forstått oppgaven så skulle den bare skrive ut Tommytall dersom en av faktorene blir et av de gitte Tommytallene. Hva gjør jeg galt?image.thumb.png.2b0235b076200235cff42dce2ee147ec.png

Som nevnt over, ikke definer funksjonene i else. Du skal kalle funksjoner i koden ikke definere de om noe skjer. Og om du skal skrive Tommy tall etter å ha kalkulert må du sjekke slik du gjør i starten.

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...