题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!(n≤50)。
其中 !
表示阶乘,定义为 n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5×4×3×2×1=120。
输入格式
一个正整数 n。
输出格式
一个正整数 S,表示计算结果。
输入输出样例
输入
3
输出
9
说明/提示
【数据范围】
对于 100% 的数据,1≤n≤50。
代码
无注释版
#include<bits/stdc++.h>
using namespace std;
const int m=110;
int a[110],b[110];
int main(){int n;cin>>n;a[0]=b[0]=1;for(int i=2;i<=n;i++){for(int j=0;j<m;j++){b[j]*=i;}for(int j=0;j<m;j++){if(b[j]>9){b[j+1]+=b[j]/10;b[j]%=10;}}for(int j=0;j<m;j++){a[j]+=b[j];if(a[j]>9){a[j+1]+=a[j]/10;a[j]%=10;}}}int k=m;for(k=m;k>0&&a[k]==0;k--);for(int i=k;i>=0;i--){cout<<a[i];}}
有注释版
#include<bits/stdc++.h>
using namespace std;const int m = 110; // 定义一个常量m,表示数组的大小,用于存储结果int a[110], b[110]; // a数组用来存储最终结果,b数组用来存储每次计算阶乘的结果int main(){b数组用来存储每次计算阶乘的结果int main(){int n;cin >> n; // 输入n,表示我们要求1! + 2! + ... + n!a[0] = b[0] = 1; // 初始化a和b数组的第一个元素为1// 从2!开始计算,到n!for(int i = 2; i <= n; i++){// 计算i!,存储到b数组中for(int j = 0; j < m; j++){b[j] *= i;}// 处理b数组中因乘法导致的进位for(int j = 0; j < m; j++){if(b[j] > 9){ // 如果b[j]大于9,说明需要进位b[j+1] += b[j] / 10; // 将进位加到b[j+1]上b[j] %= 10; // b[j]保留个位数}}// 将b数组的结果加到a数组中(加上当前阶乘值)for(int j = 0; j < m; j++){a[j] += b[j]; // a[j] += b[j]表示累加每个阶乘的结果if(a[j] > 9){ // 处理进位a[j+1] += a[j] / 10; // 将进位加到a[j+1]上a[j] %= 10; // a[j]保留个位数}}}// 找到a数组中有效数字的最后一个位置int k = m;for(k = m; k > 0 && a[k] == 0; k--); // 从最后一个元素开始向前查找,找到第一个不为0的元素// 输出结果for(int i = k; i >= 0; i--){cout << a[i]; // 从高位到低位输出a数组的数字}
}