zoukankan      html  css  js  c++  java
  • SCAU 8617 阶乘数字和 (水题)

    8617 阶乘数字和

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

    题型: 编程题   语言: 无限制

    Description

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

    Input

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

    Output

    一个整数

    Sample Input

    5
    2
    0
    

    Sample Output

    3
    2
    

    Source

    jiangju0

    Provider

    admin

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int sum[100],  i, j, t, temp, e, flag;
        memset(sum, 0, sizeof(sum));
        while(scanf("%d", &t) != EOF && t)
        {
            flag = 0;
            sum[0] = 1;
            for(i=t; i>=1; --i)
            {
                for(j=0, e=0; j<100; ++j)
                    {
                        temp = sum[j];
                        sum[j] = (e + sum[j]*i)%10;
                        e = (e + temp*i)/10; 
                    }
            }
            for(i=99; i>=0; --i) flag += sum[i];
            printf("%d\n",flag);
            memset(sum, 0, sizeof(sum));
        }
        return 0;
        
    }

    解题报告:
    本来想用double来做的,代码也放在这里,尽管double型能够表示的范围足够表示50!,但double型    只能表示十进制的15或16位有效数字  所以精度丢失在所难免,  

    Ptotest Code
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int i, j, n, sum = 0, len;
        double num;
        char s[100];
        memset(s, 0, sizeof(s));
        while(scanf("%d", &n) != EOF && n)
        {
            for(i=n, num=1; i>=1; --i)
            num = num*i;
            sprintf(s, "%lf", num);
            len = strlen(s);
            for(i=0,sum=0; i<len&&s[i]!='.'; ++i) sum += (s[i]-'0');
            printf("%d\n", sum);
            memset(s, 0, sizeof(s));
        }
        return 0;
    }

    比如说运行上面用double型写的的代码输入:19 20 21 22 23 50
    输出为:
    121645100408832000.000000
    45
    2432902008176640000.000000
    54
    51090942171709440000.000000
    63
    1124000727777607700000.000000
    65
    25852016738884978000000.000000
    91
    30414093201713376000000000000000000000000000000000000000000000000.000000
    54

    而正常的输出应为:

    121645100408832000
    45
    2432902008176640000
    54
    51090942171709440000
    63
    1124000727777607680000
    72
    25852016738884976640000
    99
    30414093201713378043612608166064768844377641568960512000000000000
    216

    算涨经验了

  • 相关阅读:
    交汇的火力
    1.4.5 动态字段
    1.4.4 复制字段
    1.4.3 定义字段
    Maven-编译打包
    1.4.2 solr字段类型--(1.4.2.7)字段属性使用案例
    1.4.2 solr字段类型--(1.4.2.6)使用外部文件和程序
    1.4.2 solr字段类型--(1.4.2.5)使用枚举字段
    1.4.2 solr字段类型--(1.4.2.4)使用Dates(日期)
    1.4.2 solr字段类型--(1.4.2.3)使用货币和汇率
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/2764910.html
Copyright © 2011-2022 走看看