社区讨论
求助
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;
}
测了第一个数据点,本地没问题
CPP123
123
CPP246
但洛谷WA了,总共五个测试点
WA WA RE RE WA
为啥啊
回复
共 9 条回复,欢迎继续交流。
正在加载回复...