我为我的实验室作品编写了两个程序,以两种不同的方式寻找小于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;
}
好吧,有一点不同 - 你在这两种情况下打印的'd'是不一样的 - 在一种情况下,它是素数,另一种情况是数字被平方并加1。同时? – Eran
d只是为了调试的目的,我只是忘了删除它。除此之外它没有意义。现在删除它 – cain
那么你得到的结果是什么? –