标签:
时间限制:500MS 内存限制:1000K 提交次数:224 通过次数:64
题型: 编程题 语言: C++;C
我们知道一个数的阶乘n! = 1*2*……*n一般是一个很大的数。现在要计算的是一个数阶乘之后得出来的数所有位上的数字相加的和。
输入为多case输入。每个case只有一行,输入一个正整数n(1<=n <= 50),当输入0时结束
一个整数。
5
2
0
3
/*这里模拟了大数乘法来计算高精度阶乘*/ #include<stdio.h> #include<string.h> #define MAX 100 int main() { int f[MAX];/*通过修改数组大小可以计算更大的阶乘*/ int i,j,s,k,n,sum; while(1) { memset(f,0,sizeof(f)); f[0]=1;/*这个必须要有*/ sum=0; scanf("%d",&n); if(n==0) break; for(i=2; i<=n; i++) { k=0;/*k是进位*/ for(j=0; j<MAX; j++)//比如计算5!初始化结果 1 0 0 0 0 0 0 0。。。。 { //2分别乘以以上数字,得 2 0 0 0 0 0 0 0。。。。 s=i*f[j]+k; //3分别乘以以上数字,得 6 0 0 0 0 0 0 0。。。。 f[j]=s%10; //4分别乘以以上数字,得 4 2 0 0 0 0 0 0。。。。 k=s/10; //5分别乘以以上数字,得 0 2 1 0 0 0 0 0。。。。 } } for(i=MAX-1; i>=0; i--) if(f[i]) break;/*由于是逆序存放结果,应去除后面多余的0*/ for(j=i; j>=0; j--) sum+=f[j]; printf("%d\n",sum); } } /*很明显,这个算法是很不高效的,应为有很多次的沈余运算*/
2
Time:15ms
标签:
原文地址:http://www.cnblogs.com/orchidzjl/p/4209519.html