2016-01-24 25 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

相關問題