[NOIP1998 普及组] 阶乘之和
题目描述
 用高精度计算出
     
      
       
        
         S
        
        
         =
        
        
         1
        
        
         !
        
        
         +
        
        
         2
        
        
         !
        
        
         +
        
        
         3
        
        
         !
        
        
         +
        
        
         ⋯
        
        
         +
        
        
         n
        
        
         !
        
        
         (
        
        
         n
        
        
         ≤
        
        
         50
        
        
         )
        
       
       
         S = 1! + 2! + 3! + \cdots + n!(n \le 50)
       
      
     S=1!+2!+3!+⋯+n!(n≤50)
其中“!”表示阶乘,例如: 5 ! = 5 × 4 × 3 × 2 × 1 5! = 5 \times 4 \times 3 \times 2 \times 1 5!=5×4×3×2×1
输入格式
 一个正整数 n。
输出格式
 一个正整数S,表示计算结果。
输入输出样例
 输入 #1复制
 3
 输出 #1复制
 9
 说明/提示
 【数据范围】
对于 100% 的数据,1≤n≤50。
 高精度加法和乘法的题目
 详细高精度计算算法可以参考博主的另一篇博文
 高精度大数的加减乘除算法解析
 AC代码(C++)
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>& a, vector<int>& b)
{
    vector<int> c;
    int temp = 0;	//存储进位
    //a,b里只要有字符那么就得计数
    for (int i = 0; i < a.size() || i < b.size() || temp; i++)
    {
        if (i < a.size())
            temp += a[i];
        if (i < b.size())
            temp += b[i];
        //必须取余,例如9+8 = 17,个位放17%10=7
        c.push_back(temp % 10);
        //考虑进位 17/10 = 1
        temp /= 10;
    }
    //上面的例子9+8后循环直接结束如果temp非零得加入所有循环在temp非零时还得走
    return c;
}
int main()
{
    vector<int> a, b, c;
    //初始化
    //a是7145,b是129
    a.push_back(5);
    a.push_back(4);
    a.push_back(1);
    a.push_back(7);
    b.push_back(9);
    b.push_back(2);
    b.push_back(1);
    c = add(a, b);
    //因为数字高位在容器的低位所以逆序输出
    for (auto it = c.rbegin(); it != c.rend(); it++)
        cout << *it;
    return 0;
}










