码迷,mamicode.com
首页 > 其他好文 > 详细

8617 阶乘数字和

时间:2015-01-07 23:21:12      阅读:615      评论:0      收藏:0      [点我收藏+]

标签:

时间限制:500MS  内存限制:1000K 提交次数:224 通过次数:64

题型编程题   语言: C++;C

Description

我们知道一个数的阶乘n! = 1*2*……*n一般是一个很大的数。现在要计算的是一个数阶乘之后得出来的数所有位上的数字相加的和。 

输入格式

输入为多case输入。每个case只有一行,输入一个正整数n(1<=n <= 50),当输入0时结束

 

输出格式

一个整数。

 

输入样例

5

2

 

输出样例

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);
    }
}
/*很明显,这个算法是很不高效的,应为有很多次的沈余运算*/
View Code

 

2

Time:15ms

8617 阶乘数字和

标签:

原文地址:http://www.cnblogs.com/orchidzjl/p/4209519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!