2016-11-20 64 views
0

當試圖解決Kochan的練習 - 在C書中編程(ex 4循環章節)時,問題是編寫前10個階乘數字。我試圖用嵌套循環來解決它,但結果是一個完全垃圾。 我擡起頭,發現一個與我的非常相似的解決方案,但我注意到變量的位置不同。爲什麼變量賦值的地方如此重要? [C]

上一頁溶液:

/*This program calculates the first 10 factorials*/ 

#include <stdio.h> 

int main(void){ 
    int n,i; 
    unsigned long int fact=1; 
    printf(" n\t\t n!\n"); 
    printf("---\t\t--------\n"); 
    for(n=1; n<=10; n++){ 
     for(i = 1; i<=n; i++){ 
      fact*=i; 
     }  
     printf("%2d\t\t%7ld\n",n,fact); 
    } 

    return 0; 
} 

輸出:

./factorial 
n  n! 
---  -------- 
1   1 
2   2 
3   12 
4   288 
5  34560 
6  24883200 
7  857276416 
8  -511705088 
9  1073741824 
10   0 

固定溶液:

輸出:

./factorial 
n  n! 
---  -------- 
1   1 
2   2 
3   6 
4   24 
5   120 
6   720 
7   5040 
8  40320 
9  362880 
10  3628800 

請注意,唯一的區別是變量事實在第二個解決方案中是局部的,而在前一個解決方案中是全局的。

所以我想這個問題現在是澄清的,爲什麼改變這個地方似乎解決了這個問題?爲什麼將這個變量放在首位呢? 在此先感謝!

+1

因爲在「固定」示例中,它在外循環的for循環的每次迭代中被重新初始化爲1,而在你的循環中它不是並且它保持以前的值 – UnholySheep

+0

你可以很好地回答那個在你自己的。 'fact = 1;'如何以及在哪裏?需要初始化? –

+0

@UnholySheep我沒有注意到這一點。謝了哥們 –

回答

0

問題不是這麼多,其中變量是宣稱爲,因爲它是初始化。在正確的代碼中,fact爲每個新的n設置爲1,以便「開始新鮮」並計算階乘。在你的代碼中,你不會重置fact,所以它繼續保留之前的n的剩餘值,所以你計算n! 以前的結果。

另一種解決方法是去除內循環,並利用這個事實,即n! = n ×(n -1)! (這也會更好)

1

因爲在n的每次迭代期間,變量設置爲1.如果在循環的開始處將其設置爲1,則可以在第一個代碼中聲明它迭代n,它應該給你相同的結果。