2012-09-01 39 views
1

這是一個計算一個數的階乘的程序,我將它存儲在一個向量中。該程序適用於最多30個輸入,但對於n = 40或更大,它會產生一個奇怪的輸出。 例如。爲什麼輸出包含 - 在這個程序中?

輸入:

3 

4 

30 

40 

輸出:

24 

265252859812191058636308480000000 

-190350521-236-6-6-5-745611269596115894272000000000 

哪裏此 - 號從何而來?

#include<vector> 
#include<cstdio> 
#include<algorithm> 
using namespace std; 
vector<int> solve(int n){ 
     if(n==1){ 
       vector<int> ans; 
       ans.push_back(1); 
       return ans; 
     } 
     vector<int> b=solve(n-1); 
     int temp=0,x=0; 
     for(int i=0;i<b.size();i++){ 
       x=b[i]*n+temp; 
       b[i]=x%10; 
       temp=x/10; 
     } 
     if(temp!=0) 
      b.push_back(temp); 
     return b; 
} 
    int main(){ 
      int t,n,i; 
      scanf("%d",&t); 
      while(t--){ 
        scanf("%d",&n); 
        vector<int> ans=solve(n); 
        for(int j=ans.size()-1;j>=0;j--) 
          printf("%d",ans[j]); 
        printf("\n"); 
      } 
    }   
+2

由於您使用_signed_整數? –

+0

但我正在計算整個向量 int代碼,所以它在哪裏消極? – Jignesh

+1

如果您不相信我,請使用調試器遍歷代碼,並且您會看到您向矢量中推入的某些值將爲負數。請參閱David Schwartz關於此原因的答案。 –

回答

1

它是整數溢出。固定大小的整數只能保存如此大的值,然後溢出。您可能想要使用像GMP這樣的任意精度整數庫。

這些變化運行你的代碼,它會變得明顯:

vector<int> solve(int n) 
{ 
    if(n==1){ 
      vector<int> ans; 
      ans.push_back(1); 
      return ans; 
    } 
    vector<int> b=solve(n-1); 
    int temp=0,x=0; 
    cout << "b.size=" << b.size() << ", n=" << n << endl; 
    for(int i=0;i<b.size();i++){ 
      x=b[i]*n+temp; 
      cout << "b[ " << i << "]=" << b[i] << ", temp= " << temp << ", x=" << x << endl; 
      b[i]=x%10; 
      temp=x/10; 
    } 
    if(temp!=0) 
    { 
     cout << "push_back(" << temp << ")" << endl; 
     b.push_back(temp); 
    } 
    return b; 
} 
+0

這並不完全準確。這也是我的第一個想法,但請注意,他實際上試圖根據'std :: vector ' – Puppy

+0

創建自己的bignum。不過,它會溢出。弄清楚他出錯的地方需要了解這個應該如何工作。但是如果他只是想弄清楚它的負面情況,最簡單的方法是添加足夠的日誌記錄來查看值爆炸的位置。 –

相關問題