2016-01-24 54 views
2

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

的第一个程序

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; 

    } 
} 

第二方案

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; 
    } 

} 

编辑:: 下面是正确的isPrime function..now节目是给同样的答案:)

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

好吧,有一点不同 - 你在这两种情况下打印的'd'是不一样的 - 在一种情况下,它是素数,另一种情况是数字被平方并加1。同时? – Eran

+0

d只是为了调试的目的,我只是忘了删除它。除此之外它没有意义。现在删除它 – cain

+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; 
    } 

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

+0

OP仅检查奇数是否为素数,所以isPrime是好的,但是PerfectSquare是有缺陷的。既然它没有通过潜在的素数,但少一个,这总是一个偶数。 –

+0

@JensSchauder计数器示例:k = 3,x = 10传递给程序2中的isPrime。 – Henry

+0

我认为这两个函数都是正确的。我想找到一个既是(素数和形式k^2 + 1,对于任何k)的数字,例如17(对于k = 4) - 它是素数,17-1 = 16是完美的square.so是isPerfectSquare将始终采用prime-1类型的数字,即偶数和isPrime函数 - 偶数不是质数,但2 – cain

相关问题