0

我正在尝试制作一个素数列表。我已经对其进行了编码,但它只告诉我 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);
    }
}
4

4 回答 4

5

您在 for 循环中调用 system.exit(0) 。这样它将在第一次迭代后终止程序。删除该行,然后尝试运行程序。它会给你正确的结果。

于 2013-04-08T04:58:21.663 回答
1

除了修复你的代码,你还应该修复你的算法。您正在使用一种称为试用除法的算法,随着您的限制增加,该算法会非常缓慢。相反,您应该使用一种称为埃拉托色尼筛法的算法,它是在两千多年前发明的,至今仍被广泛使用。这是埃拉托色尼筛的简单版本的伪代码;我把它留给你翻译成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。然后 3 是未交叉的,所以报告为素数并划掉 9、12、15、18、21、24 和 27。由于 4 已划掉,下一个未划线的数是 5,因此将其报告为素数并划掉 25。最后,由于 7 * 7 大于 30,内循环停止执行,外循环收集其余素数:7、11、13、17、19、23 和 29。

如果您对使用素数编程感兴趣,我在我的博客上谦虚地推荐一篇文章,其中提供了埃拉托色尼筛法的优化版本。

于 2013-04-08T13:55:24.417 回答
0

在内部循环中,迭代到 SQRT(N) 而不是 N 就足够了。它可以减少一点运行时间。

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

}
于 2013-04-08T05:01:59.347 回答
0

用于写出 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);
        }
    }
于 2017-08-19T23:19:03.817 回答