题目描述
用高精度计算出 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数组的数字
}
}