2016-11-24 21 views
1

以下代碼計算輸入整數的階乘。我在2個測試用例的代碼塊中運行它 - 9 & 2,並得到正確的輸出。對於相同的輸入,ideone的輸出階乘爲6,但輸出9的階乘正確。出了什麼問題?另外,當我使b爲一個大小爲200而不是動態的靜態數組時,ideone會給出正確的輸出。相同輸入的ideone和codeblock中的不同輸出(小因數)

#include <iostream> 
#include <cstdio> 
using namespace std; 
int main(){ 
    int t,i,j,k,temp,carry=0,len=0; 
    scanf("%d",&t); 
    int *b=new int; 
    int *a=new int[t]; 
    for (i=0;i<t;i++){ 
     scanf("%d",&a[i]); 
     } 
    for (i=0;i<t;i++){ 
     len=0; 
     b[0]=1; 
     for (j=1;j<=a[i];j++){ 
      carry=0; 
      for (k=0;k<=len;k++){ 
       temp=b[k]*j+carry; 
       b[k]=temp%10; 
       carry=temp/10; 
       } 
      while (carry!=0){ 
      b[++len]=carry%10; 
      carry/=10; 
      } 
     } 
     for (j=len;j>=0;j--){ 
      printf("%d",b[j]); 
      } 
     printf("\n"); 
    } 
    return 0; 
} 
+0

'INT * B = INT新;' - 你爲什麼要使用一個指針嗎?爲什麼不只是聲明一個'int'? – PaulMcKenzie

+0

另外,我不明白你輸入到你的程序中。你說你輸入'9'和'2',但是你的程序在循環中顯示'scanf'被調用。爲什麼不把數據硬編碼到程序中,以免讓人感到困惑? – PaulMcKenzie

回答

1
int *b=new int; 

僅分配一個用於b對象。之後只有b[0]*b有效。 b[k]對於0以外的值k無效。因此,你的程序有未定義的行爲。

如果尺寸200工程的靜態數組,然後

int *b=new int[200]; 

應該工作。


如果在編譯時已知數組的大小,我會建議使用數組而不是使用動態分配的內存。身高

int b[200]; 

int *b=new int[200]; 
+0

謝謝,我現在明白了。但是,爲什麼靜態數組應該比動態更受歡迎呢? –

+0

@NikhilKaushik,如果可以的話,有幾個原因使用靜態數組。動態數組需要更多的代碼來管理分配和釋放。使用動態分配的內存會更昂貴 - 運行時間必須做記錄工作。 –

相關問題