代码如下
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string tostring(long long l){
string str="";
if(l==0){
str="0";
return str;
}
while(l!=0){
int t=l%10;
str+=char(t+48);
l/=10;
}
reverse(str.begin(),str.end());
return str;
}
string highadd(string a,string b){
int lena=a.length(),lenb=b.length();
string sum;
if(lena<lenb){
swap(a,b);
swap(lena,lenb);
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=lenb;i<lena;i++){
b+='0';
}
int up=0;
for(int i=0;i<lena;i++){
int t=up+(a[i]-48)+(b[i]-48);
sum+=char(t%10+48);
up=t/10;
}
if(up!=0)sum+=char(up+48);
reverse(sum.begin(),sum.end());
return sum;
}
string hightimes(string a,string b){
int lena=a.length(),lenb=b.length();
string sum;
if(lena<lenb){
swap(a,b);
swap(lena,lenb);
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int __sum[lena+lenb+100];
for(int i=0;i<lena+lenb+100;i++){
sum+='0';
__sum[i]=0;
}
int up=0;
/*
4 5 6
* 1 2 3
1 3 6 8
9 1 2
4 5 6
5 6 0 8 8
*/
for(int i=0;i<lenb;i++){
for(int j=0;j<lena;j++){
int t=up+(a[j]-48)*(b[i]-48);
__sum[i+j]=__sum[i+j]+t%10;//这里(原来)sum只有char大小,这一位上的乘积超过128之后就会爆负数
up=t/10;
}
if(up!=0)__sum[lena+lenb-1]=__sum[lena+lenb-1]+up;
}
for(int i=0;i<sum.length();i++){
if(__sum[i]>=10){
__sum[i+1]+=__sum[i]/10;
__sum[i]=__sum[i]%10;
}
sum[i]=char(__sum[i]+48);
}
reverse(sum.begin(),sum.end());
int first=0;
while(sum[first]=='0')first++;
string _sum=sum.substr(first,sum.length()-first+1);
return _sum;
}
int highcompare(string a,string b){
int lena=a.length(),lenb=b.length();
if(lena>lenb)return 1;
if(lena<lenb)return -1;
for(int i=0;i<lena;i++){
if(a[i]>b[i])return 1;
if(a[i]<b[i])return -1;
}
return 0;
}
string highfactorial(string str){
if(str=="0")return 0;
string ans="1",len="1";
while(highcompare(len,str)<1){
ans=hightimes(ans,len);
len=highadd(len,"1");
}
return ans;
}
int main(){
int n,i;
string ans="0";
cin>>n;
for(i=1;i<=n;i++){
ans=highadd(ans,highfactorial(tostring(i)));
}
cout<<ans<<endl;
}
很抱歉,观感可能不好,高精度是自己写的。 经测试,阶乘到13以后,数字两端的计算会出现问题,原因不明,求解答