2016-03-06 246 views
1

我做了代碼的挑戰,我發現了一些奇怪的東西,我的代碼怎麼回事,所以我用C++Javascript與C++,相同的代碼,不同的結果,爲什麼?

function sumPrimes (num) 
{ 
    var sum=0; 
    for(var i=2; i<num; i++) 
    { 
     if(primeNumber(i)===true) 
      sum+=i; 
    } 
    return sum; 
} 


function primeNumber (i) 
{ 
    if(i==2 || i==3 || i==5 || i==7) 
     return true; 
    if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0) 
     return true; 
} 

sumPrimes(977); 

這給我造成的107812跑,但是當我做相同的C++

#include <iostream> 
using namespace std; 
bool primeNumber(int); 
int sumPrimes(int); 
int main() 
{ 
    int n; 
    cout << "n: "; 
    cin >> n; 
    cout << "Sum : " << sumPrimes(n) << endl; 
    system("PAUSE>=0"); 
} 
int sumPrimes(int n) 
{ 
    int sum = 0; 
    for (int i = 2; i < n; i++) 
    { 
     if (primeNumber(i) == true) 
      sum += i; 
    } 
    return sum; 
} 
bool primeNumber(int i) 
{ 
    if (i == 2 || i == 3 || i == 5 || i == 7) 
     return true; 
    if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) 
     return true; 
} 

結果是108583.

任何人能解釋這是怎麼回事?

+6

什麼時候'primeNumber'返回false?也許是一個提示。 – erip

+0

但是你意識到,你使用的主要測試聲明許多數字不是首要的,第一個是121? – Ctx

+1

未定義執行達到非void函數末尾而未顯式返回值的C++行爲。 –

回答

6

這兩個程序都有兩個主要問題。

  • 如果條件不符合,您永遠不會明確地返回false

這些編程語言看不懂你的心,讓他們不明白,如果你如果滿足條件不返回true,你也想返回false是條件見面。

如果在執行函數時沒有返回某些東西,則JS代碼返回undefined

您的C++代碼實際上調用了未定義的行爲(UB),因爲執行到達非void函數的末尾而沒有返回值。

不幸的是,這些都不能保證false。一個簡單的(也許天真?)解決方案就是在結束之前將return false;撲上去。

  • 您的算法錯誤!

既然你正在努力提高你的技能,我會把這個作爲一個練習,但是我會建議你多考慮一個素數的定義。 :)

+0

我的算法大約100正常工作,但經典的新手的錯誤,會有人輸入595295,我的算法是行不通的笑 但感謝的人,不知道JS返回undefined .. 和,還有什麼錯誤我,爲什麼相同的算法,代碼給出不同的結果:S –

+0

@ code_newbie23這很好!如果您還有其他問題,請隨時添加另一個問題。 – erip

+0

//評論被編輯 –

相關問題