题目描述:
用高精度计算出S=1!+2!+3!+…+n!(n≤100),其中“!”表示阶乘,例如:5!=5×4×3×2×1。
输入正整数n,输出计算结果S。
输入:
一个正整数n。
输出:
计算结果S。
输入样例:
5
输出样例:
153
做题思路:
阶乘和很明显就是阶乘进阶了一点点,本质上只多了一个大整数相加的方法。如果对阶乘不太熟悉,我上一篇写的就是求阶乘的方法,可以看看。不过我觉得直接看这篇也够了。为了方便运算,我们直接另外写一个大整数相加的函数,在每次乘完后,就调用加法函数,将阶乘和保存在另一个数组中,最后倒序输出。
大整数的要点主要就是:通过字符读入(有大整数需要读入的情况下)、倒序存储在数组中、逐位计算(注意进位细节)、去除前导0、倒序输出。
具体代码如下:
#include <bits/stdc++.h>
using namespace std;
int d[100000]={0};//数组d用于存储阶乘和
int ld=1;//数值的位数,初值为1
void bigjia(int a[],int m){//高精度相加函数
int l=max(ld,m);//取最长位数
int jw=0;//存储进位
for(int i=0;i<=l;i++){//更新数组d
int t=jw+a[i]+d[i];
d[i]=t%10;
jw=t/10;
}
while(d[l]==0&&l!=0) l--;//去除前导0
ld=l;//更新数组d的位数
}
int main(){
int n;
cin>>n;
int a[100000]={0};//用于存放n的阶乘
a[0]=1;//初值为1
d[0]=1;//初值为1
int m=1;//整数的位数,初始值为1
for(int i=2;i<=n;i++){
int jw=0;//存储进位
for(int j=0;j<m;j++){//倒序存放整数,从左到右计算
int t=jw+a[j]*i;
a[j]=t%10;
jw=t/10;
}
while(jw){//若最后一位进位不为0
a[m++]=jw%10;
jw=jw/10;
}
bigjia(a,m);//调用高精度加函数,计算n的阶乘和
}
for(int i=ld;i>=0;i--){
cout<<d[i];//倒序输出数组d
}
}