我爲我的實驗室作品編寫了兩個程序,以兩種不同的方式尋找小於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
那麼你得到的結果是什麼? –