C語言:求n的階乘/求1!+2!+.....+n!
阿新 • • 發佈:2019-02-18
首先求n的階乘,我們先要產生1-n的數字,然後累乘起來,利用for迴圈來實現。
所以求n的階乘的具體程式碼如下:
#include <stdio.h> #include <stdlib.h> int main() { int i = 0; int n = 0; int ret = 1; scanf_s("%d", &n);//輸入n for (i = 1; i <= n; i++)//產生1-n的數 { ret = ret*i;//將i累乘賦值給ret } printf("%d", ret); system("pause"); return 0; }
接下來我們求1!+2!+.....+n!
根據上面的n的階乘,我們可以構想在for迴圈的外側再加入一個for迴圈即可以產生階乘的累加。
初步程式碼實現如下:(假設我們求1.2.3的階乘累加起來,我們預計的結果是1+2+6=9)
#include <stdio.h> #include <stdlib.h> int main() { int i = 0; int n = 0; int num = 0; int ret = 1; for (n = 1; n <= 3; n++)//在外面巢狀一層for迴圈 { for (i = 1; i <= n; i++) { ret = ret*i; } num = num + ret;//每次的ret累加給num } printf("%d\n", num); system("pause"); return 0; }
但最終執行的結果如下:
執行的結果是15,並不是我們預計的9,所以對程式碼進行除錯發現ret在不斷迴圈中發生了改變。所以我們需要在每次開始迴圈之前需要對ret重新賦值為1。
修改的程式碼如下:
#include <stdio.h> #include <stdlib.h> int main() { int i = 0; int n = 0; int num = 0; int ret = 1; for (n = 1; n <= 3; n++) { ret = 1;//在迴圈之前將ret賦值為1 for (i = 1; i <= n; i++) { ret = ret*i; } num = num + ret; } printf("%d\n", num); system("pause"); return 0; }
這樣改動之後的程式碼的結果就正確了,為9。
在寫完這段程式碼之後,發現這段程式碼還可以進行簡化,所以我們使用一個for迴圈就可以實現。思路可以理解為1的階乘乘2就是2的階乘,2的階乘乘3就是3的階乘,把每一次的階乘結果相加就是n的階乘。
所以最終優化的程式碼如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n = 0;
int num = 0;
int ret = 1;
for (n = 1; n <= 3; n++)
{
ret = ret*n;//求出每一個數的階乘
num = num + ret;//累加給num
}
printf("%d\n", num);
system("pause");
return 0;
}