0

我已經嘗試了一個調試器並且抓取並拋出,儘管我承認我對這兩者都不舒服。但我無法在程序中找到Floating Point Exception的原因。奇怪的是它對數字運行完美< = 35.除此之外,它引發了例外。問題在哪裏?浮點異常的問題

int fibo(int n) 
{ if(n==0 || n==1) 
     return 1; 
    int p=1; 
    while(n>1) 
     p*=(n--); 
    return p; 
} 

int main() 
{ int T; 
    int N, M; 
    cin>>T; 
    for(int i=0; i<T; i++) 
    { 
     cin>>N>>M; 
     int cnt=1; 
     int ones=N, twos=0; 
     if(ones==1 && M==1) 
     { cout<<"CORRECT"<<endl; 
      continue; 
     } 
     else if(ones==1 && M!=1) 
     { cout<<"INCORRECT"<<endl; 
      continue; 
     } 

     while(ones>=2) 
     { 
      ones-=2; 
      twos++; 
      cnt+= fibo(ones+twos)/(fibo(ones) * fibo(twos)); 
     } 
     cout<<cnt<<endl; 
     int tmp=0; 
     while(cnt>0) 
     { if(cnt%2 == 1) 
       tmp++; 
      cnt/=2; 
     } 
     if( tmp==M ) 
      cout<<"CORRECT"<<endl; 
     else 
      cout<<"INCORRECT"<<endl; 
    } 

    system("pause"); 
    return 0; 
} 

非常感謝。

+2

我看不出有任何浮點或雙精度......哪有浮點異常的問題? – swtdrgn

+0

我完全不知所措。適用於每個數字36以上。我先在Visual Studio上試了一下,然後是Linux,到處都是一樣的。 – Chocolava

+1

這將有助於看到它發生在哪條線上,或更好的是再現問題的最小部分代碼(沒有用戶輸入或循環,只是因子函數,除法和常量)。您可能正在進入由0問題或分區溢出(INT_MIN/-1)劃分的分區,但很難說清楚。 –

回答

1

「浮點異常」不是C++異常。 trycatch不會幫助你。這是一個不幸的術語,但它來自操作系統,更像是一個「崩潰」。

更令人困惑的是,當您嘗試執行整數除以零時,您可以在某些平臺上看到它。我沒有解開你的代碼,但增加了大量的調試輸出並跟蹤你的變量的值,並找到你被零除的地方,因爲,你正在做某處。 :)

唯一的地方,我可以看到這是一個候選人是:

cnt+= fibo(ones+twos)/(fibo(ones) * fibo(twos)) 
//     ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

然後我的代碼有什麼問題? – Chocolava

+0

我做了所有。我只在兩個地方劃分,而不是在任何地方劃分爲零。 – Chocolava

+0

您可以看到fibo的塊。它不能返回0. – Chocolava