#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;
}
計算大數的階乘 代碼詳細解釋
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.