2012-12-17 31 views
-1

我用下面的代碼來解決問題#14,但由於一些奇怪的原因,它沒有輸出。也許它需要太長時間才能運行? P.S.I知道max不應該是答案,但仍然沒有輸出,而對於像我這樣的較小值,我得到輸出。項目歐拉#14代碼輸出不來

#include <iostream> 
long collatz(long); 

int main() 
{ 
    using namespace std; 
long i=3,max; 
for(i=3;i<1000000;i++) 
{ 
    max=collatz(i-1); 
    if(collatz(i)>collatz(i-1)) 
    { 
     max=collatz(i); 
    } 
    else 
    { 
     max=collatz(i-1); 
    } 
} 
cout<<max<<endl; 
cin.clear(); 
cin.get(); 
} 
long collatz(long n) 
{ 
int count=0; 
while(n!=1) 
{ 
    if(n%2==0) 
    { 
     n=n/2; 
     count+=1; 
    } 
    else 
    { 
     n=3*n+1; 
    } 
} 
return count; 
} 
+1

嘗試調試器。 – MikeTheLiar

+0

btw ...你爲什麼要多次調用遞歸函數collat​​z()?你不能將i和i-1的值保存在循環外部的變量中嗎?從collat​​zMinus1 = collat​​z(2)開始,並將其設置爲collat​​z(i)每個循環迭代 – mohaps

+0

@mohaps你在哪裏看到'collat​​z'是遞歸的? –

回答

4

如果調用在Collat​​z其中n = 113383,你得到溢出和正變負從中永無翻身之日。所以你有一個無限循環,因爲它永遠不會是1.你需要使用一個很長的內部collat​​z。

但是,您的collat​​z功能還有別人指出的其他問題。另外,你在main中循環的邏輯是不正確的。您每次都通過循環重置最大值。所以,你報告的結果是collat​​z(999999)或collat​​z(999998)。但這不是正確的答案。