繁体   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