先放个题目:
以及链接:P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P1601
然后贴下我的代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char c[600],d[600]; //期望输入的倒过来的数
char a[600],b[600];//正确表示
int sum[600],result[600];;//加后结果 反转输出
int main()
{
int m,n,Max; //记录a,b的数位 ,记录最大数位
int num,sign; //记录单个位置上的计算结果 ,和进位情况
cin>>c;//输入两个数并计算数位
cin>>d;
m=strlen(c);
n=strlen(d);
Max=max(m,n); //计算最大数位
memset(a,'0',sizeof(a)); //初始化数组,防止出错
memset(b,'0',sizeof(b));
for(int i=0;i<m;++i) //反转
a[i]=c[m-1-i];
for(int j=0;j<n;++j)
b[j]=d[n-1-j];
for(int l=0;l<Max;++l){
if(sign==1) //计算总和
num=(int)a[l]-'0'+(int)b[l]-'0'+1;
else
num=(int)a[l]-'0'+(int)b[l]-'0';
sign=0; //重置进位
if(num>9)
sign=1;
num%=10;
sum[l]=num;
if(l==Max-1&&sign==1){ //如果计算到最后一位还有进位,max计数加一并且下一位置1
sum[Max]=1;
Max++;
break;
}
}
for(int i=0;i<Max;++i) //反转
result[i]=sum[Max-1-i];
for(int j=0;j<Max;j++)
cout<<result[j];
return 0;
}
这题是比较经典的题了(虽然我写代码加debug花了快两小时) :
几个我觉得有点难的点:
1.我原来在字符数组的输入中用的cin.getline但貌似洛谷的测试环境是linux,但过去是windows的,洛谷貌似是直接移植了导致换行符有问题,所以cin.getline()输入会错,然后测试点全部判wa,改成cin就好了。
2.在输入数字后反转从个位开始做加法前需要将a,b,数组初始化否则在出现不同数位的加减法的时候会由于数组没有初始化导致出错。
memset(a,'0',sizeof(a)); //初始化数组,防止出错
memset(b,'0',sizeof(b));
其他就没什么难点了。
by————2023.11.6刷题记录