素数的模数算法

时间:2013-12-30 11:24:43

标签: java primes modulo

我正在尝试获取一个程序来获取某个范围内的素数(用户输入最大数量),这个名为maxNumber的变量将用于停止while循环。使用的控制变量从第一个素数2开始,称为i,用于分别打印出素数(找到时)和自然数。

我的问题是我不确定我的算法在主方法和mutator方法中是否都是正确的,我有一个问题,我把用户输入(最大数字),但没有任何事情发生后 - 基本上,它正在编译和运行,但在输入第一个变量时没有响应。

非常感谢帮助!

import java.util.*;
public class PrimeCalculator {

    private static int maxNumber;
    private static int divisibleCount;

public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);
    int i = 2;

    System.out.println("Enter the maximum amount of numbers you want to find prime numbers within: ");
    maxNumber = scanner.nextInt();

    while(i <= maxNumber)
        isPrime(i);
            if(divisibleCount < 2)
        System.out.println(i + " is a prime number");
            if(divisibleCount > 2)
        System.out.println(i + " is not a prime number.");
            divisibleCount = 0;
            i++;
    }

public static void isPrime(int n) {
    divisibleCount = 0;
    for(int x = 1; x <= maxNumber; x++ )
         if(n%x == 0)
             divisibleCount++;
             }

}

3 个答案:

答案 0 :(得分:1)

虽然我不认为你要问的是什么,但我会提出一些建议。

  1. 首先,在您的主要方法中,将if(divisibleCount < 2)更改为if(divisibleCount <= 2),因为素数除以1且自己(因此,“divisibleCount”为2 )。

  2. 另外,在你的while循环中,你应该检查i是否等于1,并说它不是素数。

  3. 如评论中所述,在isPrime方法中,您可以将循环更改为 for(int x = 1; x <= n ; x++ )因为一个数字不可能被更大的东西完全分割(即6除以10不能有模数0)

    编辑:正如dcsohl建议的那样,让for(int x = 1; x <= Math.sqrt(n); x++) 更好(见comment

  4. 检查语法。在while循环中,您没有打开和关闭括号,因此只有isPrime(i)在循环中执行。想象

    while(i <= maxNumber){
        isPrime(i);
    }
    if(divisibleCount < 2) // ....etc
    

    由于我在循环中永远不会增加,它总是2,所以......我们有一个无限循环

  5. (一般改进)围绕块中的maxNumber = scanner.nextInt();,以避免在输入say,字符串而不是int时崩溃。

  6. 这些是我发现的问题,希望我帮助过你。


    PS。如果您有任何其他问题(例如通用代码检查),您应该在Code Review而不是Stack Overflow上询问它们

答案 1 :(得分:0)

我不会回答你的Java问题,但枚举素数的常规算法是两千年前希腊数学家发明的Eratosthenes的筛子:

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

此算法检查从<2> n 的每个数字 p ;如果 p 是素数,则 i 上的循环将 p 的所有倍数标记为 False ; i 循环从 p 的平方开始,因为所有较小的倍数已经被较小的素数标记为 False

如果您对使用素数编程感兴趣,我会在我的博客上谦虚地推荐this essay

答案 2 :(得分:-2)

import java.io.*;
class Prime
{
    public static void main(String args[])
    {
        long i,j,n=1000000100000L;
        long sum=0;
        long i1=1000000000000L;
        long c;
        System.out.println("The Prime Numbers are:");
        for(i=i1;i<=n;i++)
        {
            c=0;
            for(j=2;j<=10000000;j++)
            {
                if(i%j==0)
                    c=c+1;
                if(c==1)
                    break;
            }
            if(c==0)
            {
                System.out.println(i);
                sum=sum+i;
            }
        }
        System.out.println("The Sum of Prime numbers are:"+sum);
    }
}