2016-03-21 37 views
0

它只是出於某種原因並沒有給出正確的答案,並且由於某種原因,它給出了正確的答案和較小的輸入。我的歐拉問題10代碼有什麼問題?

public class Problem10 { 
    public static void main(String[] args) { 
     System.out.println(sumPrimeNumber(2000000)); 
    } 
    public static boolean isPrime(int prime){ 
     boolean isPrime = true; 
     if(prime%2==0) 
      return false; 
     for(int i = 3;i<=Math.pow(prime, 0.5);i+=2){ 
      if(prime%i==0){ 
       return false; 
      } 
     } 
     return isPrime; 
    } 
    public static int sumPrimeNumber(int max){ 
     int sum = 0; 
     int prime = 3; 
     while(prime < max){ 
      if(isPrime(prime)){ 
       sum += prime; 
      } 
      prime += 2; 
     } 
     return sum + 2; 
    } 
} 
+0

你應該使用比INT更高的數據類型,因爲你正在處理更大的數字...... –

回答

0

我想我應該把總和改爲long。我雖然它沒有溢出,因爲它給出了一個正整數。

0

你的int(最大20億)可能溢出。 更改長整數。

public class Problem10 { 
    public static void main(String[] args) { 
     System.out.println(sumPrimeNumber(2000000)); 
    } 
    public static boolean isPrime(long prime){ 
     boolean isPrime = true; 
     if(prime%2==0) 
      return false; 
     for(int i = 3;i<=Math.pow(prime, 0.5);i+=2){ 
      if(prime%i==0){ 
       return false; 
      } 
     } 
     return isPrime; 
    } 
    public static int sumPrimeNumber(long max){ 
     long sum = 0; 
     int prime = 3; 
     while(prime < max){ 
      if(isPrime(prime)){ 
       sum += prime; 
      } 
      prime += 2; 
     } 
     return sum + 2; 
    } 
} 
+0

它只是200萬,它給出了答案,這也是一個int –

+0

你不覺得有至少1000個數字之間素數是1,000,000和2,000,000嗎?它們的總和肯定會溢出。 –

+0

您需要將'sumPrimeNumber'的返回類型更改爲'long'(我建議進行編輯,但儘管您的「_Change ints longs._」三位評論者都覺得「此編輯偏離了原文的原意「)。有了這個額外的修復程序,代碼給出了正確的答案。您可能還應該合併[rossum的修復](http://stackoverflow.com/a/36200105/2096401),儘管它不會影響答案,因爲OP的代碼從3開始並在返回語句中顯式添加2。 – TripeHound

0

您的isPrime()函數有錯誤。它將2標記爲複合,返回false。

更改初始if到:

if (prime % 2 == 0) 
    return prime == 2; 

將返回true 2和false其他偶數。

+0

正確,但在這種情況下無關緊要,因爲循環僅考慮從3開始的素數(2被添加到return語句中)。 – TripeHound

+0

最好將你的方法從'isPrime()'重命名爲'isOddPrime()',以表明它做得更清楚。要麼這樣做,要麼將其操作糾正爲2.目前它的運行方式與預期的不同。 – rossum