Java Prime数字

时间:2013-04-08 04:55:46

标签: java primes

我正在尝试制作一个素数列表。我编码了它,但它只告诉我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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

除了修复代码外,您还应该修复算法。您正在使用一种称为试验分区的算法,当您的限制增加时,这种算法将会非常缓慢。相反,你应该使用一种名为Sierat of Eratosthenes的算法,这种算法是在两千多年前发明的,至今仍在广泛使用。这是一个简单版本的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。然后3未交叉,因此将其报告为素数并交叉输出9,12,15,18,21,24和27.由于4已被划掉,下一个未交叉的数字为5,因此将其报告为素数并交叉出25最后,由于7 * 7大于30,内循环停止执行,外循环收集其余的素数:7,11,13,17,19,23和29。

如果您对使用素数进行编程感兴趣,我会在我的博客上谦虚地推荐essay,其中包括Eratosthenes筛选的优化版本。

答案 2 :(得分:0)

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

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

}

答案 3 :(得分: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);
        }
    }