社区讨论

求助

P1601高精度加法参与者 3已保存回复 9

讨论操作

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

当前回复
9 条
当前快照
1 份
快照标识符
@lo1cfkh2
此快照首次捕获于
2023/10/22 18:46
2 年前
此快照最后确认于
2023/11/02 19:07
2 年前
查看原帖
CPP
#include <iostream>
#define Digit 505

using namespace std;

int main() {
	char a[Digit],b[Digit]; // 用于存储输入的两个大整数的字符数组
	int Ans[Digit]; // 存储计算结果的数组,每一位代表相应位置上的数字
	int i_1=0,i_2=0; // 分别记录a和b的长度
	
	// 初始化数组
	for(int i=0;i<Digit;i++){
		a[i]='n';
		b[i]='n';
		Ans[i]=0;
	}
	
	// 输入第一个大整数,直到遇到换行符
	while(1){
		a[i_1]=getchar();
		if(a[i_1]=='\n') break;
		else i_1++;
	}
	
	// 输入第二个大整数,直到遇到换行符
	while(1){
		b[i_2]=getchar();
		if(b[i_2]=='\n') break;
		else i_2++;
	}
	
	int flag=0; // 进位标志位
	
	if(i_1>=i_2){ // 如果第一个大整数的长度大于等于第二个
		int i_max=i_1; // 记录两个大整数中较长的长度
		
		// 从两个大整数的最低位开始逐位相加
		while(i_2-1>=0){
			// 将对应位置的字符转换为数字并相加
			Ans[i_1-1]=a[i_1-1]-'0'+b[i_2-1]-'0';
			
			// 加上进位
			Ans[i_1-1]+=flag;
			
			// 如果相加结果大于等于10,需要进位
			if(Ans[i_1-1]>=10) Ans[i_1-1]-=10,flag=1;
			else flag=0;
			
			i_1--;
			i_2--;
		}
		
		// 当第二个大整数已经加完但第一个还有剩余时
		while(i_2-1<0 && i_1-1>=0){
			
			// 将对应位置的字符转换为数字并相加
			Ans[i_1-1]=a[i_1-1]-'0';
			
			// 加上进位
			Ans[i_1-1]+=flag;
			
			// 如果相加结果大于等于10,需要进位
			if(Ans[i_1-1]>=10) Ans[i_1-1]-=10,flag=1;
			else flag=0;
			
			i_1--;
			i_2--;
		}
		
		// 输出结果
		if(flag==1) cout<<'1'; // 如果最高位有进位,需要输出1
		for(int i=0;i<i_max;i++) cout<<Ans[i]; // 输出每一位的数字
	}
	
	if(i_2>i_1){ // 如果第二个大整数的长度大于第一个
		int i_max=i_2; // 记录两个大整数中较长的长度
		
		// 从两个大整数的最低位开始逐位相加
		while(i_1-1>=0){
			// 将对应位置的字符转换为数字并相加
			Ans[i_2-1]=a[i_1-1]-'0'+b[i_2-1]-'0';
			
			// 加上进位
			Ans[i_2-1]+=flag;
			
			// 如果相加结果大于等于10,需要进位
			if(Ans[i_2-1]>=10) Ans[i_2-1]-=10,flag=1;
			else flag=0;
			
			i_1--;
			i_2--;
		}
		
		// 当第一个大整数已经加完但第二个还有剩余时
		while(i_1-1<0 && i_2-1>=0){
			
			// 将对应位置的字符转换为数字并相加
			Ans[i_2-1]=b[i_2-1]-'0';
			
			// 加上进位
			Ans[i_2-1]+=flag;
			
			// 如果相加结果大于等于10,需要进位
			if(Ans[i_2-1]>=10) Ans[i_2-1]-=10,flag=1;
			else flag=0;
			
			i_1--;
			i_2--;
		}
		
		// 输出结果
		if(flag==1) cout<<'1'; // 如果最高位有进位,需要输出1
		for(int i=0;i<i_max;i++) cout<<Ans[i]; // 输出每一位的数字
	}
	
	return 0;
}

测了第一个数据点,本地没问题
CPP
123
123
CPP
246
但洛谷WA了,总共五个测试点 WA WA RE RE WA 为啥啊

回复

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

正在加载回复...