• 【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;
    }

  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632434.html
Copyright © 2020-2023  润新知