Java-为什么这两个给出不同的输出来计算形式k ^ 2 + 1的素数?

时间:2016-01-24 07:29:00

标签: java math time-complexity primes

我为我的实验室工作编写了两个程序,以两种不同的方式找到形式k ^ 2 +1小于1000000的素数,以便在第二个程序中获得更好的时间复杂度,但我在两者中得到不同的答案。 有人可以告诉我为什么吗?首先我们首先检查它是否是素数(n),然后检查它是否是完美的正方形(n-1)。 在第二个中,我们直接检查形式k ^ 2 + 1的k小于sqrt(1000000)-1并增加计数。 但两者都产生不同的答案。哪种方法适合计算形式k ^ 2 + 1低于1000000的素数?

第一个程序

<ul id='course-list'>
  <li>Course 1</li>
  <li>Course 2</li>
  <li>Course 3</li>
  <li>Course 4</li>
  <li>Course 5</li>
</ul>
<ul id='course-list-2'>
  <li>Course 1</li>
  <li>Course 2</li>
  <li>Course 3</li>
  <li>Course 4</li>
  <li>Course 5</li>
</ul>
<ul id='course-list-3'>
  <li>Course 1</li>
  <li>Course 2</li>
  <li>Course 3</li>
  <li>Course 4</li>
  <li>Course 5</li>
</ul>

第二个计划

 public class KSqPlus1
    {

    public static void main(String [] args)
  { 
     int k = 2;
    for (int n = 11; n < 1000000; n += 2)
       if (isPrime (n))
         if (isPerfectSquare (n - 1))
         {   k ++; 

       }

     System.out.println (k);  

  }

   public static boolean isPrime(int n)
   {
     for(int divisor=3;divisor*divisor<=n;divisor+=2)
         if(n%divisor==0)
           return false;
        return true;
   }
  public static boolean isPerfectSquare (int n)
     {
          for(int divisor=2;divisor*divisor<=n;divisor+=2)
         if(divisor * divisor < n) continue;
          else if (divisor * divisor == n ) return true;
          return false;

     }
 } 

EDIT :: 下面是正确的isPrime函数..现在程序给出了相同的答案:)

import java.lang.Math;
public class PrimeArrays1
{

  public static void main(String [] args)
  {

    int count=2;int k;
    for(k=3;k<(Math.sqrt(1000000)-1);k++)
    { int x=k*k+1;
     if(isPrime(x))
     {
      count++;

     }
    }
     System.out.println(count);



  }

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

 } 

1 个答案:

答案 0 :(得分:2)

此方法

  public static boolean isPerfectSquare (int n)
     {
          for(int divisor=2;divisor*divisor<=n;divisor+=2)
         if(divisor * divisor < n) continue;
          else if (divisor * divisor == n ) return true;
          return false;

     }
仅当true是偶数的平方时,

才会返回n。我想你想检查它是否是任何数字的正方形。

同样,方法

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

不检查2的因子,所以4,8,...返回true