計算大數的階乘 代碼詳細解釋

#include <stdio.h>
#include<stdlib.h>//要使用malloc是要包含此頭文件,動態內存分配
#include<math.h>
//因爲要求的n比較大,所以正常的整數可能是存儲不下的。
//所以需要 使用別的方法。
//這裏使用的方法就是建立動態數組,數組的每個元素是一個 0-9 的整數。
//比如10!的結果是3628800   這個動態數組裏面存儲的就是3 6 2 8 8 0 0 
int main()
{
	int n;
	printf("please input n \n");
	scanf("%d", &n);
	if (n <= 1)
	{
		printf("error:n<=1");
		return 0;
	}
	int len = (int)log10(n) * n;  //結果長度。這裏先計算階乘的計算結果的位數,這樣就可以申請數組了。
	if (len == 0) len = n;
	//我數學也不是很好。這裏計算階乘結果的位數 需要 數學知識。
	//這個代碼 這裏使用的方法 計算出來的位數 是 多了的。最少多0個。
	//和基本的動態建立數組的思想是一致的,往多了建。
	int* sum = (int*)malloc(len * (sizeof(int)));  //這裏申請數組了。
	for (int i = 0; i < len; i++)//數組賦值
	{
		sum[i] = 0;
	}
	//先把數組初始化爲0
	sum[len - 1] = 1;  //最後一位爲1

	//接下來這一段是具體的計算階乘,並把結果存儲在數組的後面幾位。即存儲元素是從後往前存儲的。
	int j;
	int pre = 0;  //遞進符號
	for (int i = 2; i <= n; i++)   //爲什麼從2開始,因爲計算階乘嘛,1不用乘。
	{
		for (j = len - 1; j >= 0; j--)  //這個循環的意思就是用數組的數字 乘以i並加上pre.依次向前,這樣可以把超過1位的結果向前傳遞。
		{
			int temp = pre + sum[j] * i;  //進位加這一位該做的計算。
			pre = temp / 10;  //pre是進位
			sum[j] = temp % 10;  //sum[j]就是這一位本來該存放的數字。
		}
	}

	//你看,它把元素存儲在數組的後面,前面的爲0的會跳過的。
	j = 0;
	while (sum[j] == 0)j++;
	for (; j < len; j++)
	{
		printf("%d", sum[j]);
	}
	if (sum != NULL) {
		free(sum);
		sum = NULL;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章