Java Ohjelma alkuluvun tarkistamiseen esimerkin avulla

โšก ร„lykรคs yhteenveto

Java Alkulukujen tarkistusohjelma havainnollistaa, kuinka yksittรคisen kokonaisluvun jaollisuutta testataan ja luokitellaan alkuluvuksi tai yhdistetyksi luvuksi. Tรคmรค artikkeli kรคsittelee matemaattista mรครคritelmรครค, silmukkalogiikkaa, tรคydellistรค ajettavaa koodia, neliรถjuuren optimointia, monimutkaisuusvertailua ja yleisiรค aloittelijoiden virheitรค.

  • ๐Ÿ”ข Mรครคritelmรคsรครคntรถ: Alkuluku on luonnollinen luku, joka on suurempi kuin 1 ja jolla on tรคsmรคlleen kaksi jakajaa, 1 ja itse luku.
  • ๐Ÿ” Silmukkalogiikka: Jaa ehdokas millรค tahansa kokonaisluvulla kahdesta puoleen luvusta ja merkitse muistiin, onko jokin jakojรครคnnรถs nolla.
  • ๐Ÿšฉ Lippukuvio: Boolen muuttuja tallentaa tuomion, ja break-lauseke poistuu silmukasta heti, kun jakaja lรถytyy.
  • โˆš Neliรถjuuren optimointi: Jakajien testaaminen vain neliรถjuureen asti pienentรครค iteraatiomรครคrรครค arvosta n/2 arvoon โˆšn muuttamatta tulosta.
  • โš ๏ธ Edge-kotelot: Nolla, yksi ja negatiiviset arvot eivรคt ole koskaan alkulukuja, kun taas 2 on ainoa parillinen alkuluku.
  • โฑ๏ธ Monimutkaisuuden vertailu: Perussilmukka suoritetaan ajassa O(n) ja neliรถjuurimenetelmรค ajassa O(โˆšn).
  • ๐Ÿงช Todentamiskรคytรคntรถ: Testaa lukuja 1, 2, 9, 17 ja 97 vahvistaaksesi jokaisen reunaehdon.

Java Ohjelma alkuluvun tarkistamiseksi

Mikรค on alkuluku?

Alkuluku on luonnollinen luku, joka on suurempi kuin 1 ja joka on jaollinen vain luvulla 1 tai itsellรครคn. Esimerkiksi luku 11 on jaollinen vain luvulla 1 tai itsellรครคn. Muita alkulukuja ovat 2, 3, 5, 7, 11, 13, 17, ja lukujono jatkuu loputtomasti.

Lukua, joka on suurempi kuin 1 ja joka ei ole alkuluku, kutsutaan yhdistetyksi luvuksi, koska se voidaan muodostaa pienemmistรค tekijรถistรค. Luku 9 on yhdistetty luku, koska se on tasan jaettu 3:lla, ja luku 15 on yhdistetty luku, koska se on tasan jaettu 3:lla ja 5:llรค.

Huomautus: 0 ja 1 eivรคt ole alkulukuja. 2 on ainoa parillinen alkuluku, ja negatiivisia arvoja ei koskaan pidetรค alkulukuina.

Kuinka tarkistaa, onko luku alkuluku Java

Todennusstrategia on suoraviivainen jaollisuustesti. Ota ehdokasarvo, jaa se vuorollaan jokaisella pienemmรคllรค kokonaisluvulla ja tutki modulusoperaattorin palauttamaa jakojรครคnnรถstรค. Nollan jakojรครคnnรถs todistaa, ettรค jakaja on olemassa, mikรค vรคlittรถmรคsti hylkรครค luvun.

Ohjelman logiikka:

  • Meidรคn tรคytyy jakaa syรถttรถluku, esimerkiksi 17, lukujen 2 ja 17 vรคlillรค ja tarkistaa jakojรครคnnรถs. Jos jakojรครคnnรถs on 0, luku ei ole alkuluku.
  • Mikรครคn luku ei ole jaollinen enemmรคn kuin puolella itsestรครคn. Joten meidรคn tรคytyy silmukka kautta vain numberToCheck/2Jos syรถte on 17, puolikas on 8.5 ja silmukka iteroituu arvojen 2โ€“8 lรคpi.
  • Jos numberToCheck on tรคysin jaollinen toisella luvulla, lippu isPrime asetetaan arvoon false ja silmukka poistuu.

Kaksi Java ominaisuudet kantavat koko algoritmin. Modulusoperaattori % palauttaa kokonaislukujakamisen jakojรครคnnรถsosan ja break lauseke pysรคyttรครค silmukan heti, kun vastaus on tiedossa, joten turhia iteraatioita ei suoriteta.

Java Ohjelma, joka tarkistaa, onko luku alkuluku vai ei

Alla oleva ohjelma antaa muuttujalle numberToCheck arvon 17 ja tulostaa jokaisen jakolaskuaskeleen, jotta voit seurata pรครคttelyรค rivi riviltรค. Koodia voi muokata, joten muuta arvoa ja suorita se uudelleen yhdistetyllรค luvulla, kuten 21, nรคhdรคksesi pรคinvastaisen tuloksen.

public class PrimenumberToCheckCheck {

 public static void main(String[] args) {
  int remainder;
  boolean isPrime=true;
  int numberToCheck=17; // Enter the number you want to check for prime

  //Loop to check whether the number is divisible by any number other than 1 and itself
  for(int i=2;i<=numberToCheck/2;i++)
  {
   //number is divided by i
            remainder=numberToCheck%i;
            System.out.println(numberToCheck+" Divided by "+ i + " gives a remainder "+remainder);

       //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
     if(remainder==0)
     {
        isPrime=false;
        break;
     }
  }
  // Check value true or false, if isPrime is true then the number is prime otherwise not prime
  if(isPrime)
     System.out.println(numberToCheck + " is a Prime number");
  else
     System.out.println(numberToCheck + " is not a Prime number");
    }
  }

Odotettu tuotos:

17 Divided by 2 gives a remainder 1
17 Divided by 3 gives a remainder 2
17 Divided by 4 gives a remainder 1
17 Divided by 5 gives a remainder 2
17 Divided by 6 gives a remainder 5
17 Divided by 7 gives a remainder 3
17 Divided by 8 gives a remainder 1
17 is a Prime number

Silmukka pysรคhtyy lukuun 8, koska kokonaislukuaritmetiikassa 17 jaettuna 2:lla on yhtรค kuin 8. Koska mikรครคn jakojรครคnnรถs ei ole koskaan ollut nolla, isPrime-lippu pitรครค alkuarvonsa true ja loppuehto tulostaa positiivisen tuloksen.

Optimoitu alkulukutarkistus neliรถjuurimenetelmรคllรค

Luvun jakaminen puolella on oikein, mutta tuhlausta. Jos luvun n jakaja on suurempi kuin sen neliรถjuuri, vastaavan yhteisjakajan on oltava pienempi kuin neliรถjuuri, joten se olisi jo lรถydetty. Tarkistaminen โˆšn:รครคn asti tuottaa siis saman vastauksen paljon vรคhemmillรค iteraatioilla.

public class PrimeCheckOptimized {

    public static boolean isPrime(int n) {
        // 0, 1 and negative values are never prime
        if (n <= 1) {
            return false;
        }
        // 2 is the only even prime number
        if (n == 2) {
            return true;
        }
        if (n % 2 == 0) {
            return false;
        }
        // test only odd divisors up to the square root
        for (int i = 3; i * i <= n; i += 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int[] samples = {1, 2, 9, 17, 97};
        for (int value : samples) {
            System.out.println(value + " is prime: " + isPrime(value));
        }
    }
}

lรคhtรถ:

1 is prime: false
2 is prime: true
9 is prime: false
17 is prime: true
97 is prime: true

Kunto i * i <= n vรคlttรครค liukulukukutsun funktiolle Math.sqrt, ja kahden askel ohittaa jokaisen parillisen jakajan. Arvolla, kuten 1 000 003, perussilmukka suorittaa noin 500 000 iteraatiota, kun taas tรคmรค versio suorittaa alle 500.

Tarkista kรคyttรคjรคn syรถttรคmรค alkuluku

Kovakoodattu syรถttรถ on kรคtevรครค demonstraatioissa, mutta oikeissa harjoituksissa yleensรค vaaditaan nรคppรคimistรถsyรถttรถรค. Scanner-luokka lukee kokonaisluvun konsolista ja vรคlittรครค sen samalle isPrime-metodille.

import java.util.Scanner;

public class PrimeCheckUserInput {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a number: ");
        int number = sc.nextInt();

        boolean isPrime = number > 1;
        for (int i = 2; i * i <= number; i++) {
            if (number % i == 0) {
                isPrime = false;
                break;
            }
        }

        System.out.println(number + (isPrime ? " is a Prime number" : " is not a Prime number"));
        sc.close();
    }
}

Nรคyteajo:

Enter a number: 29
29 is a Prime number

๐Ÿ’ก Vinkki: Lipun alustaminen number > 1 kรคsittelee arvot 0, 1 ja kaikki negatiiviset syรถtteet yhdessรค lausekkeessa, mikรค poistaa tarpeen erilliselle suojalausekkeelle.

Yleisiรค virheitรค alkulukuohjelman kirjoittamisessa

Useimmat virheelliset lรคhetykset epรคonnistuvat raja-arvojen perusteella pรครคasiallisen silmukan sijaan. Alla oleva luettelo kattaa virheet, joita esiintyy useimmin aloittelijan koodissa.

  1. Silmukan aloittaminen kohdasta 1: Jokainen kokonaisluku on jaollinen ykkรถsellรค, joten lippu asetetaan vรคlittรถmรคsti arvoon epรคtosi ja ohjelma raportoi, ettei mikรครคn luku ole alkuluku.
  2. Kรคsittelemรคllรค 1 alkulukuna: Arvolla 1 on vain yksi jakaja, joten se ei lรคpรคise kahden jakajan mรครคritelmรครค ja sen on palautettava arvon false.
  3. Katkaisulausekkeen poisjรคttรคminen: Ohjelma palauttaa edelleen oikean vastauksen, mutta iterointi jatkuu vielรค tuomion tiedostamisen jรคlkeen, mikรค tuhlaa aikaa suuriin syรถtteisiin.
  4. Kรคyttรคminen i <= n rajana: Luku jakaa aina itsensรค, joten silmukan on loputtava ennen kuin se saavuttaa luvun n.
  5. Vertailuun = sijasta ==: Yksi yhtรคsuuruusmerkki mรครคrittรครค arvon testaamisen sijaan, mikรค tuottaa kรครคnnรถsaikaisen virheen if-ehdossa.

Prime Checking -menetelmien vertailu

Valitse menetelmรค, joka vastaa syรถtteen kokoa ja sitรค, testataanko yhtรค arvoa vai koko aluetta.

Menetelmรค Jakajavรคli testattu Ajan monimutkaisuus Sopii parhaiten
Perussilmukka 2:sta n-1:een O (n) Ydinlogiikan oppiminen
Puolikasjako 2 - n/2 O (n) Pienet syรถtteet, yksinkertainen koodi
Neliรถjuurimenetelmรค 2:sta โˆšn:รครคn O(โˆšn) Yksittรคiset suuret arvot
Eratosthenesin seula Esilaskettu taulukko O(n log log n) Listataan kaikki alkuluvut vรคlillรค

Kun kokonainen alue on luokiteltava yhden arvon sijaan, seula on paljon tehokkaampi. Seuraohjelmamme lรถytรครค tรคrkein Numbers alkaen 1 ja 100 osoittaa kyseisen kaavan. Katso aiheeseen liittyviรค silmukkapohjaisia โ€‹โ€‹harjoituksia Fibonaccin sarja Java, The Java palindromiohjelma, ja Bubble Lajittele algoritmi JavaAloittelijoiden, jotka tarvitsevat kertausta lipun ja vastamerkin julistamisesta, kannattaa lukea aiheesta Java muuttujat pรครคasiassa Java oppitunti.

UKK

Ei. Luvulla 1 on vain yksi jakaja, joten se ei tรคytรค kahden jakajan mรครคritelmรครค. Minkรค tahansa oikean ohjelman on palautettava arvon false luvulle 1, 0 ja jokaiselle negatiiviselle kokonaisluvulle.

Jakajat esiintyvรคt pareittain. Jos neliรถjuurta suurempi tekijรค on olemassa, sen vastinpari on neliรถjuurta pienempi ja se on jo testattu, joten lisรคtarkistuksia ei tarvita.

Kyllรค. Muuta parametrin tyyppi kokonaisluvusta pitkรคksi ja sรคilytรค sama logiikka. Yli 64 bitin arvoille kรคytรค BigInteger-metodia ja sen isProbablePrime-metodia jakolaskun sijaan.

Kyllรค. Mรครคrittele laskuri ennen silmukkaa, aseta sama ehto while-otsakkeeseen ja kasvata laskurin arvoa rungon sisรคllรค. Tuloste pysyy ennallaan.

Yleensรค kyllรค, vaikka luodusta koodista usein jรคtetรครคn pois suoja 0:lle, 1:lle ja negatiivisille syรถtteille. Suorita aina rajatestit itse ennen kuin hyvรคksyt tekoรคlyn kirjoittaman toteutuksen.

Alkulukujen avulla voidaan suojata hajautusfunktioita, satunnaislukujen generointia ja RSA-salausta, jotka suojaavat malli-API-rajapintoja ja tallennettuja tietojoukkoja. Hajautustaulukoiden koot valitaan usein alkulukujen avulla avainten tasaisen jakautumisen varmistamiseksi.

Tiivistรค tรคmรค viesti seuraavasti: