非常简单的素数测试 - 我想我不理解for循环

时间:2013-02-01 16:08:54

标签: java loops for-loop iterator primes

我正在练习以前的基础java考试的考试试卷,我发现很难做一个for循环工作来测试一个数字是否为素数。我不想通过为更大的数字添加效率度量来使其复杂化,只是至少可以用于2位数字。

即使n是素数,它总是返回false。

我认为我的问题是我在for循环本身出错了,在哪里放“返回true”;并且“返回虚假;”......我确信这是我犯的一个非常基本的错误......

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

我无法在stackoverflow上找到其他帮助的原因是因为类似的问题要求更复杂的实现以更有效的方式来实现它。

12 个答案:

答案 0 :(得分:31)

您的for循环有一点问题。它应该是: -

for (i = 2; i < n; i++)  // replace `i <= n` with `i < n`

当然,n除以n时,您不想检查余数。它总是会给你1

实际上,您甚至可以通过将条件更改为: - i <= n / 2来减少迭代次数。由于n不能除以大于n / 2的数字,除非我们考虑n,我们根本不需要考虑。

因此,您可以将for循环更改为: -

for (i = 2; i <= n / 2; i++)  

答案 1 :(得分:31)

您可以提前停止并使用以下内容快速跳过循环:

public boolean isPrime(long n) {
    // fast even test.
    if(n > 2 && (n & 1) == 0)
       return false;
    // only odd factors need to be tested up to n^0.5
    for(int i = 3; i * i <= n; i += 2)
        if (n % i == 0) 
            return false;
    return true;
}

答案 2 :(得分:3)

你应该写i < n,因为最后一次迭代步骤会给你true

答案 3 :(得分:3)

错误是i&lt; = n

for (i = 2; i<n; i++){

答案 4 :(得分:2)

public class PrimeNumberCheck {
  private static int maxNumberToCheck = 100;

  public PrimeNumberCheck() {
  }

    public static void main(String[] args) {
      PrimeNumberCheck primeNumberCheck = new PrimeNumberCheck();

      for(int ii=0;ii < maxNumberToCheck; ii++) {
        boolean isPrimeNumber = primeNumberCheck.isPrime(ii);

      System.out.println(ii + " is " + (isPrimeNumber == true ? "prime." : "not prime."));
    }
  }

  private boolean isPrime(int numberToCheck) {    
    boolean isPrime = true;

    if(numberToCheck < 2) {
      isPrime = false;
    }

    for(int ii=2;ii<numberToCheck;ii++) {
      if(numberToCheck%ii == 0) {
        isPrime = false;
        break;
      }
    }

    return isPrime;
  }
}

答案 5 :(得分:1)

这个代码号可以被3整除,将跳过for循环代码初始化。
对于循环迭代,也会跳过3的倍数。

private static boolean isPrime(int n) {

    if ((n > 2 && (n & 1) == 0) // check is it even
       || n <= 1  //check for -ve
       || (n > 3 && (n % 3 ==  0))) {  //check for 3 divisiable
            return false;
    }

    int maxLookup = (int) Math.sqrt(n);
    for (int i = 3; (i+2) <= maxLookup; i = i + 6) {
        if (n % (i+2) == 0 || n % (i+4) == 0) {
            return false;
        }
    }
    return true;
}

答案 6 :(得分:1)

您还可以在for循环中使用一些简单的Math属性。

一个数字&#39; n&#39;当且仅当它可以被1或1整除时,它将是素数。 如果数字不是素数,它将有两个因素:

n = a * b

您可以使用for循环检查数字&nbsp;&#39; n&#39;而不是一直走到&#39; n&#39;。如果&#39; a&#39;和&#39; b&#39;两者都大于数字的平方数,而a * b将大于&#39; n&#39;。因此,至少有一个因素必须小于或等于平方根。

所以你的循环将如下所示:

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

通过这样做,您可以大大减少代码的运行时复杂性。 我认为这将归结为O(n / 2)。

答案 7 :(得分:1)

最快的方法之一是循环直到n的平方根。

  private static boolean isPrime(int n){
        int square = (int)Math.ceil((Math.sqrt(n)));//find the square root
        HashSet<Integer> nos = new HashSet<>(); 
        for(int i=1;i<=square;i++){
            if(n%i==0){
                if(n/i==i){
                    nos.add(i);
                }else{
                    nos.add(i);
                    int rem = n/i;
                    nos.add(rem);
                }
            }
        }
        return nos.size()==2;//if contains 1 and n then prime
    }

答案 8 :(得分:0)

您正在检查i<=n。因此,当i==n时,您将只获得0并且将始终返回false。尝试i<=(n/2)。无需检查i<n

答案 9 :(得分:0)

上述算法将1视为素数,尽管不是。 因此,这是解决方案。

static boolean isPrime(int n) {
  int perfect_modulo = 0;
  boolean prime = false;

  for ( int i = 1; i <=  n; i++ ) {
    if ( n % i == 0 ) {
      perfect_modulo += 1;
    }
  }
  if ( perfect_modulo == 2 ) {
    prime = true;
  }

  return prime;
}

答案 10 :(得分:0)

好吧,for循环有一些问题。这是代码,

public static boolean checkPrimeNUmber(int number) 
{ 
   if(number <= 1) 
   { 
      return false; 
   } 
   for(int a = 2; a < Math.sqrt(number); a++) 
   { 
      if(number % a == 0) 
      { 
         return false; 
      } 
   } 
   return true;
}

答案 11 :(得分:0)

使用Java 8方式做得更好更清洁

    private static boolean isPrimeA(final int number) {
        return IntStream
               .rangeClosed(2, number/2)
               .noneMatch(i -> number%i == 0);
    }