使用模数运算符获取素数

时间:2013-07-23 17:30:40

标签: java

您如何修改以下内容以打印1-100中的所有素数?下面有一个问题,2号回归不是素数。数字2满足if(i%number == 0)条件,因为2%2返回为0.

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        for(int i=1; i<=100; i++){
            if(isPrime(i)){
                System.out.println(i + " is a prime number");
            }else{
                System.out.println(i + " is not a prime number");
            }
        }

    }
    public static boolean isPrime(int number){
        for(int i=2; i<=number; i++){

            if(i%number == 0){
                return false;
            }else{
                return true;
            }
        }
        return false;
    }

}

7 个答案:

答案 0 :(得分:2)

 i<=number

您不应该检查该数字是否可以被本身整除

您还有另一个问题:

        }else{
            return true;
        }

一旦找到一个不可分割的数字,即使它后来确实存在因素,你就会返回true。

答案 1 :(得分:2)

这是一个用于确定数字是否为素数的算法。

  • 数字是否小于2?如果是,请返回false。
  • 数字是2还是3?如果是,请返回true。
  • 号码是4吗?如果是,请返回false。
  • 取数字的平方根,向上舍入到下一个整数。对于小素数,这是可选的,但可以加快确定更大的数字。
  • 从2循环到数字(或数字)的平方根,递增1。
    • 将循环数除以目前确定的素数。
    • 如果除法模数为零,则返回false。
  • 如果循环完成,则返回true。

答案 2 :(得分:1)

你这里有几个问题。首先,在检查数字是否为素数时,不要检查每个数字,直到检查质量的实际数字。检查所有素数直到数字的平方根将始终是足够的。

要修复该错误,请查看for循环条件并相应地进行编辑:

for(int i=2; i<=number; i++)

其次,当一个函数返回时它停止。目前使用if / else语句:

if (i%number == 0) {
   return false;
} else {
   return true;
}

如果这个条件转到else语句,即使它返回true,你也要确保在检查了你想要的所有数字时才真正返回true。

此外,我认为你没有仔细考虑过你的基础案例。你在最后一行中所说的是,如果以前所有的东西都穿过裂缝,那么它应该假设这个数字不是素数。想一想,我相信你能够弄明白。

答案 3 :(得分:1)

这会奏效。 2是测试质数时的特殊情况。如果你开始搜索越来越大的...你可能想看看eratosphenes的筛子。

每个素数都是另一个数的倍数。以3为例。使用筛子,如果你发现3为素数,那么它将“忽略”3的所有倍数,从而减少了找到后续质数所需的时间。它加快了速度...... ALOT:)

 public class JavaApplication47 {

 public static void main(String[] args) {

    for(int i=1; i<=100; i++){
        if(isPrime(i)){
            System.out.println(i + " is a prime number");
        }else{
//                System.out.println(i + " is not a prime number");
        }
    }
}

public static boolean isPrime(int n) {
for(int i=2; 2*i<n; i++) {
    if(n%i==0)
        return false;
}
return true;
}
}

SIEVE示例 - 未实现 - 可用于参考和理解。

static boolean [] allPrimes = new boolean[10000];

public static void fillTheSieve(){
    Arrays.fill(allPrimes, true);
    allPrimes[0] = allPrimes[1] = false; //1 and 0 are false. winning

    for (int i = 2; i < allPrimes.length; i++) {
        //check if prime, if so getmultiples and declae false
        if(allPrimes[i]){
            for (int j = 2; i*j<allPrimes.length; j++) {
                allPrimes[i*j] = false;

            }
        }

    }
}

答案 4 :(得分:0)

The definition of a prime number明确指出一个人不能成为素数。

这意味着isPrime(1)应该返回false。你的实现是做什么的。

但是isPrime(2)应该返回true。你的实现没有。它不是因为(2 % 2 == 0)并且您正在检查从2到N的所有数字,而不是从2到N-1。最后一个数字N将始终产生零余数(N % N == 0)

答案 5 :(得分:0)

与Primes打交道时要考虑的几件事情。您可以在开始时使用2的特殊情况(例如if(number == 2) ...)。

除了检查i<=number之前的错误之外,只考虑您需要走多远才能确定它不是素数,因此i*i或{已提供了提示{1}}

增量Math.sqrt中的另一件事是考虑到这个问题,我意识到这只适用于前100个素数,但你应该总是考虑性能。你真的必须检查所有数字(2,3,4,5,6 ......)(提示:如果你检查它是否可以被2整除,那么你不需要检查4,6,8等...)

最后使用您的return语句,考虑使用仅在正数时设置为false / true的i++标志,该数字是素数还是不是。而且你只需要使用1个return语句。

希望有所帮助。

答案 6 :(得分:-3)

请试试这个

public static boolean isPrime(int number) {
    for(int i = 2; i * i <= number; i++) {
        if (i % number == 0) {
            return false;
        } else {
            return true;
        }
    }
    return true;
}