Java Program a Prime nyomtatásához Numbers tól 1 a 100

⚡ Okos összefoglaló

Program prímszám nyomtatására 1 és 100 hüvelyk között Java Egy tartomány minden értékét átvizsgálja, és azokat adja vissza, amelyeknek pontosan két osztójuk van. Ez a cikk ismerteti a definíciót, az ellenőrzési módszert, a teljes programot, az Eratoszthenész-szűrőt, valamint egy teljesítmény-összehasonlítást ellenőrzött kimenettel.

  • 🔢 Definíciós szabály: Egy prímszám nagyobb, mint 1, és csak 1-gyel és önmagával osztható, ami teljesen kizárja a 0-t és az 1-et.
  • 🔁 Tartományszkennelés: Egy külső ciklus 2-től a felső határértékig sétál, és minden értéket egy újrafelhasználható ellenőrző metódusnak delegál.
  • Logikai módszer: A CheckPrime függvény hamis értéket ad vissza az első megtalált osztóra, és igaz értéket, ha a ciklus egyezés nélkül fejeződik be.
  • Osztóhatár: A tesztelés az érték feléig helyes, és állj megping a négyzetgyöknél sokkal gyorsabban adja ugyanazt az eredményt.
  • 🧮 Eredményhalmaz: Pontosan 25 prímszám létezik 1 és 100 között, 97-tel végződve.
  • Szita módszer: Az Eratoszthenész szitája egy logikai tömbben jelöli ki a többszörösöket, és O(n log log n) idő alatt fut.
  • 🧪 Ellenőrzési gyakorlat: Mielőtt bármilyen implementációt megbíznánk, győződjünk meg arról, hogy a 2-es szerepel, és hogy az 1-es ki van zárva.

Első Numbers 1 - 100 in Java

Mi az a prímszám?

A Prímszám olyan szám, amely csak eggyel vagy önmagával osztható. Olyan természetes szám, amely nagyobb, mint egy, és nem két kisebb természetes szám szorzata. Például a 11 csak eggyel vagy önmagával osztható. További prímszámok a 2, 3, 5, 7, 11, 13, 17 és így tovább.

Jegyzet: 0 és 1 nem prímszámok. A 2 az egyetlen páros prímszám.

1 és 100 között pontosan 25 prímszám található. Az alábbi táblázat évtizedek szerint csoportosítja őket, ami láthatóvá teszi a ritkuló mintázatot az értékek növekedésével.

Választék Első Numbers Gróf
1 - 20 2, 3, 5, 7, 11, 13, 17, 19 8
21 - 40 23, 29, 31, 37 4
41 - 60 41, 43, 47, 53, 59 5
61 - 80 61, 67, 71, 73, 79 5
81 - 100 83, 89, 97 3

Hogyan nyomtatjunk Prime Numbers 1 és 100 közötti program Java

Az alábbiakban a Java program prímszámok nyomtatására 1-től 100-ig:

Program logika:

  • A fő módszer a prímszám program be Java tartalmaz egy ciklust, amely egyesével ellenőrzi az 1 és 100 közötti prímszámokat.
  • A fő módszer a metódusnak nevezi CheckPrime annak megállapítására, hogy egy szám prímszám-e Java vagy sem.
  • Egy bemeneti számot, mondjuk a 17-et, el kell osztanunk 2-től 17-ig terjedő értékekkel, és ellenőriznünk kell a maradékot. Ha a maradék 0, akkor a szám nem prím.
  • Egyetlen szám sem osztható önmaga felénél nagyobb számmal. Tehát csak a numberToCheck/2 cikluson kell keresztülmennünk. Ha a bemenet 17, akkor a fele 8.5, és a ciklus 2-től 8-ig terjedő értékeken keresztül fog iterálni.
  • If numberToCheck teljes egészében osztható egy másik számmal, akkor hamis értéket adunk vissza, és a ciklus megszakad.
  • If numberToCheck elsődleges, igazat adunk vissza.
  • Az 1 és 100 hüvelyk közötti prímszámok fő módszerében Java, ellenőrizd, hogy az isPrime a következő-e: TRUE és adjuk hozzá az értéket a prímszámhozNumbersTalált karakterlánc.
  • Végül nyomtasson prímszámokat 1 és 100 hüvelyk között Java.

A check külön metódusba való szétválasztása teszi a programot újrafelhasználhatóvá. Ugyanaz a CheckPrime metódus bármilyen felső határértékkel meghívható egyszerűen a maxCheck változó megváltoztatásával.

public class PrimeNumbers {

    public static void main(String[] args) {

        int i;
        int num = 0;
        int maxCheck = 100; // maxCheck limit till which you want to find prime numbers
        boolean isPrime = true;

        //Empty String
        String primeNumbersFound = "";

        //Start loop 2 to maxCheck
        for (i = 2; i <= maxCheck; i++) {
            isPrime = CheckPrime(i);
            if (isPrime) {
                primeNumbersFound = primeNumbersFound + i + " ";
            }
        }
        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        // Print prime numbers from 1 to maxCheck
        System.out.println(primeNumbersFound);
    }
    public static boolean CheckPrime(int numberToCheck) {
        int remainder;
        for (int i = 2; i <= numberToCheck / 2; i++) {
            remainder = numberToCheck % i;
            //if remainder is 0 then the number is not prime and we break the loop. Else continue the loop
            if (remainder == 0) {
                return false;
            }
        }
        return true;

    }

}

Várható teljesítmény:

Az 1 és 100 közötti prímszám kimenete a Java program lesz:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

A 2-es érték azért fogadható el, mert a belső ciklus feltétele i <= 2 / 2 -ra értékeli 2 <= 1, ami azonnal hamis, így a metódus osztás nélkül igaz értéket ad vissza.

Optimalizált verzió négyzetgyökkorlát használatával

A szám felére osztás helyes, de felesleges munkát végez. Az osztók mindig párosával fordulnak elő a négyzetgyök körül, tehát minden √n feletti tényezőnek van egy alatta lévő párja, amelyet már teszteltünk.

public class PrimeNumbersOptimized {

    public static void main(String[] args) {
        int maxCheck = 100;
        int count = 0;
        StringBuilder result = new StringBuilder();

        for (int i = 2; i <= maxCheck; i++) {
            if (isPrime(i)) {
                result.append(i).append(" ");
                count++;
            }
        }

        System.out.println("Prime numbers from 1 to " + maxCheck + " are:");
        System.out.println(result.toString().trim());
        System.out.println("Total primes found: " + count);
    }

    public static boolean isPrime(int n) {
        if (n <= 1) return false;
        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;
    }
}

output:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Total primes found: 25

💡 Tipp: A StringBuilder lecseréli az ismétlődő karakterlánc-összefűzést a cikluson belül. += on a String egy új objektumot hoz létre, amely mérhetővé válik, ha a felső határ eléri a több ezrest.

Print Prime Numbers Eratoszthenész szitájának használata

Amikor egy tartomány összes prímszámára szükség van, a próbaosztás nem a megfelelő eszköz. Az Eratoszthenész-szűrő egy logikai tömböt épít, minden prímszám többszöröseit összetettként jelöli meg, és beolvassa a jelöletlen részeket.

A módszer három lépésben működik:

  1. Hozz létre egy n+1 méretű logikai tömböt, és tegyük fel, hogy 2-től felfelé minden index prím.
  2. 2-től kezdve jelöljük meg az aktuális prímszám minden többszörösét összetettként.
  3. Lépjen a következő jelöletlen indexre, és ismételje meg a műveletet, amíg az n négyzetgyökét el nem éri.
import java.util.Arrays;

public class SieveOfEratosthenes {

    public static void main(String[] args) {
        int n = 100;
        boolean[] composite = new boolean[n + 1];

        for (int p = 2; p * p <= n; p++) {
            if (!composite[p]) {
                // start at p*p because smaller multiples are already marked
                for (int multiple = p * p; multiple <= n; multiple += p) {
                    composite[multiple] = true;
                }
            }
        }

        StringBuilder result = new StringBuilder();
        for (int i = 2; i <= n; i++) {
            if (!composite[i]) {
                result.append(i).append(" ");
            }
        }

        System.out.println("Prime numbers from 1 to " + n + " are:");
        System.out.println(result.toString().trim());
    }
}

output:

Prime numbers from 1 to 100 are:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

A három megközelítés összehasonlítása

Mindhárom program ugyanazt a 25 értéket nyomtatja ki, így a választás teljes mértékben a tartomány méretétől függ.

Megközelítés Idő komplexitás Extra memória Legjobb tartomány
Próbafelosztás n/2-re O(n²) O (1) Akár néhány ezerig
Próbaosztás √n-re O(n√n) O (1) Akár néhány százezerig
Eratoszthenész szita O(n log log n) O (n) Milliónyi érték

Nézze meg programunkat, hogy megtalálja prímszámok bármely bemeneti számból amikor egyetlen értéket kell tesztelni egy tartomány helyett. További ciklusvezérelt gyakorlatokért tekintse át a Fibonacci-sorozat Java, a Java palindrom program, És a Bubble Rendezési algoritmus JavaA szita által használt logikai tömböt a következő részben ismertetjük részletesebben. Java tömbök.

GYIK

Pontosan 25 van belőlük. A sorozat 2-vel kezdődik és 97-tel végződik, és a sűrűség folyamatosan csökken, ahogy az értékek nőnek.

A belső ciklus feltétele 2 <= 1 lesz, ami azonnal hamis, így nem fut osztás, és a metódus igaz értéket ad vissza. Ezt az egyetlen esetet érdemes minden implementációban tesztelni.

Változtasd meg a maxCheck változó értékét 500-ra. Ha 1 feletti értéket szeretnél kezdeni, akkor inkább a külső ciklusszámláló kezdeti értékét kell módosítanod, és az ellenőrző metódust hagyd érintetlenül.

A p minden kisebb többszöröse már tartalmaz egy kisebb prímtényezőt, és egy korábbi menet során be lett jelölve. A p négyzetétől való kezdés elkerüli a munka megismétlését.

Általában próbaosztást adnak vissza, kivéve, ha a kérés nagy tartományt vagy teljesítményt említ. A felső határ megadása a kérésben általában a szitát eredményezi.

A prímeket azért választjuk hash táblaként és jellemzővödör méretként, mert egyenletesen osztják el a kulcsokat és csökkentik az ütközéseket. Emellett a jellemzővektorizációban használt hash függvényeket is előidézik.

Foglald össze ezt a bejegyzést a következőképpen: