社区讨论

求调,玄关

P1009[NOIP 1998 普及组] 阶乘之和参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m2nfhfsm
此快照首次捕获于
2024/10/24 22:58
去年
此快照最后确认于
2025/11/04 16:16
4 个月前
查看原帖
高精度加法有问题
CPP
#include<bits/stdc++.h>
using namespace std;

string st(long long n) {
	string sum="", ans="";
	while(n){
		ans+=n%10+'0';
		n/=10;
	}int l=ans.length();
	for (int i = l-1; i >= 0; i--) sum+=ans[i];
	return sum;
}//类型转换(long long -> string) 

string jia(string s1, string s2) {
	string tsum="";//结果字符串 
	int l1=s1.length(),l2=s2.length();
	short sum[2000]={0}/*结果数组*/, a[l1+1]={2000}, b[l2+1]={2000};
	for(int i = l1-1; i >= 0; i--)a[i]=s1[l1-i-1]-'0';
	for(int i = l2-1; i >= 0; i--)b[i]=s2[l2-i-1]-'0';
	int k=0/*进位*/;
	for (int i = 0; i <= max(l1,l2); i++) {
		sum[i]=a[i]+b[i]+k;
		k=sum[i]/10;
		sum[i]%=10;
	}
	bool flag=0;
	for (int i = l1+l2+1; i >= 0; i--)
		if(sum[i]!=0||flag)flag=1,tsum+=sum[i]+'0';
	if(!flag)return "0";
	return tsum;
}//高精度加法(就是这有大问题)

string chen(string s1, string s2) {
	string tsum="";//结果字符串
	int l1=s1.length(),l2=s2.length(), f1=0/*正向计数*/;
	short a[2000]={0}, b[2000]={0}, sum[2000]={0}/*结果数组*/;
	for(int i = l1-1; i >= 0; i--) a[i]=s1[i]-'0';
	for(int i = l2-1; i >= 0; i--) b[i]=s2[i]-'0';
	for(int i = l2-1; i >= 0 ; i--) {
		int k=0/*进位*/,f2=0/*正向计数*/;
		for (int j = l1-1; j >= 0; j--) {
			sum[f1+f2]+=a[j]*b[i]+k;
			k=sum[f1+f2]/10;
			sum[f1+f2]%=10;
			f2++;
		}
		if(k>0)sum[f1+f2]+=k;
		f1++;
	}bool flag=0;
	for (int i = l1+l2+1; i >= 0; i--)
		if(sum[i]!=0||flag)flag=1,tsum+=sum[i]+'0';
	if(!flag)return "0";
	return tsum;
}//高精度乘法 

string jc(int n) {
	string sum="1";
	for(int i = 1; i <= n; i++)
		sum=chen(sum,st(i))/*, cout << sum << '\n'*/;
	return sum;
}//阶乘(没问题) 

int main() {
/*	int n;cin >> n;
	string sum="0";
	for (int i = 1; i <= n; i++) {
		cout << sum << '\n';
		sum=jia(sum,jc(i));
	}
	for (int i = 0; i < n; i++) {
		cout << i << ' ' << jc(i) << '\n';
	}
	cout << sum;*/
	string a,b;
	cin >> a >> b;
	cout << chen(a,b);
	return 0;
}

玄关

回复

1 条回复,欢迎继续交流。

正在加载回复...