一道简单的高精度加法题,自己根据高精度加法原理想出的另一种实现方式
这是题目链接
蒟蒻第一次写题解,如有不对请在评论区指正
根据高精度原理(用数组模拟实际计算)我写出来以下代码:
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
string a,b;
vector <int>ans;
int main()
{
//读入a,b两个数,反转后可以让数字按个位,十位……的顺序排列
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int lena=a.size(),lenb=b.size();
int i;
//没有数字的地方补0
if (lena<lenb){
for (i=lena;i<lenb;i++) a[i]='0';
}else if (lena>lenb){
for (i=lenb;i<lena;i++) b[i]='0';
}
int temp=0;
//模拟加法,大于10进1
for(i=0;i<max(lena,lenb);i++){
temp=temp+a[i]-'0'+b[i]-'0';
if (temp>=10){
ans.push_back(temp-10);
temp=1;
}else {
ans.push_back(temp);
temp=0;
}
}
//a+b可能会在最后一位存在进1的问题,判断一下
if (temp==1) ans.push_back(temp);
//反转ans,按照正常的顺序输出
reverse(ans.begin(),ans.end());
int len=ans.size();
for (i=0;i<len;i++){
printf ("%d",ans[i]);
}
system("pause");
return 0;
}
但是他在第五个点RE了!!!
下载了数据后我在别的oj上试了一下,给出了“double free or corruption (out)”的错误,查完资料我发现这可能应该是vector内存释放的问题,解决方法请见这篇文章
这是我修改后AC的代码
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
using namespace std;
string a,b;
vector <int>ans;
int main()
{
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int lena=a.size(),lenb=b.size();
int i;
if (lena<lenb){
for (i=lena;i<lenb;i++) a[i]='0';
}else if (lena>lenb){
for (i=lenb;i<lena;i++) b[i]='0';
}
int temp=0;
//加了这一行限制vector内存
ans.reserve(501);
for(i=0;i<max(lena,lenb);i++){
temp=temp+a[i]-'0'+b[i]-'0';
if (temp>=10){
ans.push_back(temp-10);
temp=1;
}else {
ans.push_back(temp);
temp=0;
}
}
if (temp==1) ans.push_back(temp);
reverse(ans.begin(),ans.end());
int len=ans.size();
for (i=0;i<len;i++){
printf ("%d",ans[i]);
}
system("pause");
return 0;
}