由于大数的阶乘如22!位数非常多,即使是用long double类型也无法准确表示,因此我们采用数组表示,数组每一位依次储存大数的个位、十位、百位、千位……当某一位超过十时就向下一位进位,是一种挺巧妙的表示大数的方式。C++好像还有其他特殊的库来表示大数,但笔者尚不了解,将来再补充。
下面是源代码:
#include<iostream>
#include<iomanip>
#include<string>
#include<cmath>
using namespace std;
//用高精度计算出 S =1!+2!+3!+...+ n!(n<=50),此时用long double也会溢出
int main(){
int n,fac[100]={0},res[100]={0},i=0,j=0;
cin >> n;
fac[0]=1;
res[0]=1;
for( i = 2; i <= n; ++i) {
for(j=0;j<100;j++)
fac[j]*=i;
for(j=0;j<100;j++){
if(fac[j]>9){
fac[j+1]+=fac[j]/10;//进位操作
fac[j]%=10;
}
}
for(j=0;j<100;j++){
res[j]+=fac[j];
if(res[j]>9){
res[j+1]+=res[j]/10;
res[j]%=10;
}
}
}
for(i=100;i>=0&&!res[i];i--);//找到最高位
for(j=i;j>=0;j--)//从最高位开始依次打印
cout << res[j];
return 0;
}