zoukankan      html  css  js  c++  java
  • 【9104】&&【a103】阶乘和

    Time Limit: 10 second
    Memory Limit: 2 MB

    问题描述
    已知正整数n(n≤100),设s=1!+2!+3!+...+n!。其中“!”表示阶层,即n!=1*2*3*...*(n-1)*n,如:3!=1*2*3=6。请编程实现:输入正整数n,输出计算结果s的值。

    Input

    文件输入仅一行,输入n

    Output

    s的值。

    Sample Input

    4
    

    Sample Output

    33

    【题解】

    先处理阶乘,这个是高精度乘单精度,然后在一边处理阶乘的时候,一边加起来,即高精度加法。

    【代码】

    #include <cstdio>
    
    int n,a[300],b[300],la = 1 ,lb = 1; //a数组用于存储阶乘,b数组用于存储当前的阶乘和。
    
    void input_data()
    {
        scanf("%d",&n);
        for (int i = 1;i <= 299;i++) //初始化所有的数字为0
            a[i] = 0,b[i] = 0;
        a[1] = 1; //0!== 1
    }
    
    void get_ans()
    {
        for (int i = 1;i <= n;i++) //开始获取前n个阶乘的和。
            {
                int x = 0;
                for (int j = 1;j <= la;j++) // 乘上i,同时一边处理进位
                    {
                        a[j] = a[j] * i + x;
                        x = a[j] / 10;
                        a[j] = a[j] % 10;
                    }
                while (x > 0) //如果这个数的位数还可以变大 就用while让其变大。
                    {
                        la++;
                        a[la] += x;
                        x = a[la] / 10;
                        a[la] = a[la] % 10;
                    }
                x = 0;//接下来处理加法
                int l;
                if (la > lb) //先判断哪一个数比较大,获取他的长度 用于做加法
                    l = la;
                        else
                            l = lb;
                for (int j = 1;j <= l;j++) //开始加上去 一边处理进位
                    {
                        b[j] = b[j] + a[j] + x;
                        x = b[j] / 10;
                        b[j] = b[j] % 10;
                    }
                while (x > 0) //如果可以增加长度则增加长度
                    {
                        l++;
                        b[l] += x;
                        x = b[l] / 10;
                        b[l] = b[l] % 10;
                    }
                lb = l; //更新b数组的长度
            }
    }
    
    void output_ans() //最后b数组逆序输出即可。
    {
        for (int i = lb;i >= 1;i--)
            printf("%d",b[i]);
    }
    
    int main()
    {
        //freopen("F:\rush.txt","r",stdin);
        input_data();
        get_ans();
        output_ans();
        return 0;
    }

  • 相关阅读:
    Mysql优化之6年工作经验总结
    mysql_innodb存储引擎的优化
    十六、MySQL授权命令grant的使用方法
    十五、Mysql字符集的那些事
    十四、索引
    十三、视图
    十二、存储过程
    十一、触发器
    十、存储引擎
    九、备份与恢复
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632434.html
Copyright © 2011-2022 走看看