C++98 50分 求助
查看原帖
C++98 50分 求助
143477
糖宝SugarBaby楼主2021/9/13 20:56

代码如下

#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以后,数字两端的计算会出现问题,原因不明,求解答

2021/9/13 20:56
加载中...