1. 程式人生 > >C語言:求n的階乘/求1!+2!+.....+n!

C語言:求n的階乘/求1!+2!+.....+n!

       首先求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;
}