我为我的实验室工作编写了两个程序,以两种不同的方式找到形式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;
}
}
答案 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
。