3 svar
232 visningar
Matteetuff 21 – Fd. Medlem
Postad: 16 aug 2021 14:23

Hitta primtal utan att göra onödiga beräkningar.

Hej, 

Jag läser programmering 1 och har blivit ombedd att skriva en kod som avgör om ett visst tal är ett primtal eller inte.  Jag är inte nöjd med nuvarande kod då loopen gör onödiga beräkningar. Jag önskar att koden avslutar loopen så fort den hittar > 2 delare till ett givet tal. Dock kämpar jag med att haja var break-satsen ska stå.

 

Allt gott, 

Matteetuff. 

    public static int primeNumbers(int a){

        int hej = 0;
        for(int i=1; i <= a; i++)
            if(a % i == 0)

        {
            hej += 1;



        }

     if(hej == 2){
         System.out.println("True");
     }
     else {
         System.out.println("False");
     }


        return hej;
    }
Fermatrix 7841 – Fd. Medlem
Postad: 16 aug 2021 14:29 Redigerad: 16 aug 2021 14:36

Det är i din if sats du ska bryta, sen behöver du väl inte variabeln 'hej', 1 delar alla tal så du behöver inte ens använda den. Börja på 2 och om något tal delar a så retunerar vi. 

Finns det någon anledning att funktionen är av typen int? Jag hsde gjort den till boolean oxh returnerar false om if satsen är sann, annars return true. 

Notera dock att ett primtal delar sig själv så du⁹ kommer se till att du inte missar de fallet.

Exempelvis: 7/7=1, så du kommer returnera false eftersom 7 mod 7 =0. 

Alternativt (vilket jag inser nu är förmodligen det du gör) att att se till att det max finns 2 delare, talet 1 och talet sig självt.

Annars kan du börja på 2 och loopa mellan 2<=i<a och returnera false om a mod i = 0 för att det ska alltid vara false om a är ett primtal. 

Matteetuff 21 – Fd. Medlem
Postad: 16 aug 2021 15:11

Har inte lärt mig om booleska uttryck än. Drar de mindre processorkraft än int? 

Förstår inte riktigt vad du menar med variabeln hej. Den räknar ut samtliga delare till ett visst heltal och om talet har fler än två delare så är det bekräftat att talet inte är ett primtal. 

Just när det kommer till break satsen så sabbar jag hela 'indenteringen' när jag skriver break; 

Övrigt: har testat olika alternativ för att räkna ut om ett visst tal är ett primtal eller ej. Just nu försöker jag bara, även om koden inte ser bra ut, lära mig att använda break; satsen samt göra den bättre. 

Fermatrix 7841 – Fd. Medlem
Postad: 16 aug 2021 17:51

Precis, men du behöver inte räkna antalet delare även om det också går. Här har du ett exempel på hur din loop skulle kunna se ut. 

    boolean primeCheck = false;
    for (int i = 2; i <= num / 2; ++i) {
      if (num % i == 0) {
        primeCheck= true;
        break;
      }
Svara
Close