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รค.

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
falseja 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.
- 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.
- 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.
- Katkaisulausekkeen poisjรคttรคminen: Ohjelma palauttaa edelleen oikean vastauksen, mutta iterointi jatkuu vielรค tuomion tiedostamisen jรคlkeen, mikรค tuhlaa aikaa suuriin syรถtteisiin.
- Kรคyttรคminen
i <= nrajana: Luku jakaa aina itsensรค, joten silmukan on loputtava ennen kuin se saavuttaa luvun n. - 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.
