大数阶乘
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
来源
- 经典题目 上传者
-
张云聪
i = 2 j = 0 s = a[0] *2+c = 2 a[0] = 2 c = 0i = 3 j = 0 s = a[0] *3+c = 6 a[0] = 6 c = 0i = 4 j = 0 s = a[0]*6 +c = 24 a[0] = 4 c = 2j = 1 s = a[1]*4 +2 = 2 a[1] = 2 c = 0i = 5 j = 0 s = a[0]*5 +0 = 20 a[0] = 0 c = 2j = 1 s = a[1]*5 +2 = 12 a[1] = 2 c = 1j = 2 s = a[2]*5 +1 = 1 a[2] = 1 c = 0
#include<stdio.h>
#include<string.h>
const int maxn = 20000;
int a[maxn];
int main(){
int n, i, j, s, c;
scanf("%d",&n);
memset(a,0,sizeof(a));
a[0] = 1;
for(i = 2; i <= n; i++){ //大数
c = 0;
for(j = 0; j <= maxn; j++){ //把大数阶乘的值储存起来
s = a[j] * i + c; //我们很容易理解 例: 5 * 4 * 3 * 2 * 1 = 120,但是数容易越界。
a[j] = s % 10; //要输出120,如何借用数组呢?先取模,输出个位,然后取余。
c = s / 10; //所以我们直接在每个循环直接操作,避免数过大
}
}
for(j = maxn; j >= 0; j--){
if(a[j] != 0){ //数组开始的时候初始化,要判断i=?
break;
}
}
for(i = j; i >= 0; i--){ //输出n!
printf("%d",a[i]);
}
printf("\n");
return 0;
}