大数阶乘
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
-
输入
- 输入一个整数m(0<m<=5000) 输出
- 输出m的阶乘,并在输出结束之后输入一个换行符 样例输入
-
50
样例输出
-
30414093201713378043612608166064768844377641568960512000000000000
思路:
第一步:输入数字
第二步:计算大概存储多少位
第三步:根据估算的位数创建数组,分配存储空间
第四步:从2开始到n(n为输入的要求的阶乘数)进行循环,计算每个数组元素中要存的数 [在此需要一个进位函数]
{
进位函数:
主要是对每一位进行判断
if(该位上的数字小于等于9)
不进位
else if(该位大于9并且该位不是最高位)
保存该位的进位数
保存该位
else if(该位大于9并且是最高位)
while(只要该位大于9)
{
保存进位;
保存该位;
下一位的赋值;
}
}
第五步输出:(输出之前先去确定位数[确定位数的方法,从估算位开始向下寻找,只要满足该位不是0,即课确定位数])从高向低一次输出即可
具体代码如下:
#include<stdio.h> #include<malloc.h> #include<math.h> void arry(int fact[],int pos) { int i,array = 0; for(i=0;i<=pos;i++) { fact[i] += array; if(fact[i] <=9) array = 0; else if(fact[i] >9 && i<pos) { array = fact[i] / 10; fact[i] = fact[i] % 10; } else if(fact[i]>9 && i>=pos) { while(fact[i] > 9) { array = fact[i] / 10; fact[i] = fact[i] % 10; i++; fact[i] = array; } } } } int main() { int num,digit,pos; double sum=0; int * fact; int i,j; // printf("请输入要计算的数字:"); scanf("%d",&num); for(i=1;i<=num;i++) sum += log10(i); digit = (int)sum +1; // printf("%d",digit); fact = (int *)malloc(sizeof(int) * (digit+1)); for(i=0;i<=digit;i++) fact[i] = 0; fact[0] = 1; for(i=2;i<=num;i++) { for(j=digit;j>=0;j--) if(fact[j] != 0) { pos = j; break; } for(j=0;j<=pos;j++) fact[j] *= i; arry(fact,pos); } for(i=digit;i>=0;i--) { if(fact[i] != 0) { pos = i; break; } } for(i=pos;i>=0;i--) { printf("%d",fact[i]); } printf("\n"); return 0; }