簡體   English   中英

Java素數

[英]Java Prime Numbers

我正在嘗試列出質數表。 我已經對其進行了編碼,但它僅告訴我1-100的質數是1。我不確定為什么會這樣。 我也想為此制作一個JFrame。

import javax.swing.JOptionPane;

public class ProgrammingAssignment7 {
    public static void main(String[] args) {
        //Scanner Scan = new Scanner (System.in);
        //DECLARE VARIABLES

        int x = 1;
        int i = 1;
        int iNumber = 1;
        boolean bNotPrime = false;
        boolean bIsPrime = true;
        int iNumberToTest;
        int iPrimeCheck;
        int iCounter;
        int iResult = 1;
        int iFact = 1;
        int iLimit = 100;
        String OutputStr = null;

        System.out.println("Prime numbers between 1 and " + iLimit);

        //loop through the numbers one by one
        for(i=1; i < 100; i++) {
            bIsPrime = true;

            //check to see if the number is prime
            for(int j = 2; j < i ; j++) {
                if(i % j == 0) {
                    bIsPrime = false;
                    break;
                }
            }
        }

        // print the number
        if(bIsPrime) {
            OutputStr = "The Prime Numbers of 1 - 100 are: " + i + "\n";
        }

        JOptionPane.showMessageDialog(null, OutputStr, "PRIME NUMBERS", JOptionPane.INFORMATION_MESSAGE);

        //System.out.print(i + "\n" );
        System.exit(0);
    }
}

您正在for循環中調用system.exit(0)。 這樣它將在第一次迭代后終止程序。 刪除該行,然后嘗試運行程序。 它會給您正確的結果。

除了修復代碼之外,您還應該修復算法。 您正在使用一種稱為“試驗划分”的算法,隨着您的限額增加,該算法將變得緩慢。 相反,您應該使用一種稱為Eratosthenes篩網的算法,該算法是在2000年前發明的,至今仍在廣泛使用。 這是Eratosthenes篩網的簡單版本的偽代碼; 我將它留給您翻譯成Java:

function primes(n)
    sieve := makeArray(2..n, True)
    for p from 2 to n step 1
        if sieve[p]
           output p
           for i from p * p to n step p
               sieve[i] := False

Eratosthenes的算法開始於生成從2到最大所需素數n的數字列表,然后進入迭代階段。 在每個步驟中,都將標識尚未考慮的最小的未交叉數,並從該數的平方開始減去該數的所有倍數; 重復此操作,直到沒有未交叉的數字保持不變為止。 所有未交叉的數字都是質數。 內循環從p * p開始,因為任何較小的合成物都必須已經被較小的素數消除。

例如,要查找少於30的素數,請首先報告2是素數,並舍去4、6、8、10、12、14、16、18、20、22、24、26和28。 ,因此將其報告為質數,並划掉9、12、15、18、21、24和27。由於已將4划掉,因此下一個未交叉的數字為5,因此將其報告為質數並划掉25。最后,由於7 * 7大於30,因此內部循環停止執行,並且外部循環收集其余的質數:7、11、13、17、19、23和29。

如果您對使用質數編程感興趣,我建議在我的博客上推薦一篇文章 ,該文章除其他外,還提供了Eratosthenes篩網的優化版本。

在內部循環中,迭代到SQRT(N)而不是N就足夠了。它可以稍微減少運行時間。

for(int j = 2; j < Math.sqrt(i) ; j++) {

}

聰明的算法,可以寫出1到100之間的質數(也可以寫成1- [想要多少個-如果您將另一個數字更改為100 )。 質數只能被兩個數整除:1和它本身,因此k必須等於或小於2。

for (int i=1; i<=100; i++) {
        int k = 0;
        for (int j=1; j<=i; j++ ) {
            if (i % j == 0) {
                k++;
            }
        }
        if (k <= 2) {
            System.out.println(i);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM