今天我给大家讲解一下高精度加法,其实还是挺简单的。
思路
思路很简单,就是先输入两个string字符串,然后用两个int数组存入字符串中的数字,在手写加法的运算过程,注意处理好进位和前导0,最后再倒序输出就可以了。
接下来我会详细讲解这里的每一步。
字符转数字
循环遍历字符串倒序着减去48,这样它的ascll码刚刚好就是他这个字符所代表的数字,将a赋值进数组中之后,再将b中的值挨个加进数字数组里,这样就能完成加法了。另外有一个小细节就是转数字的前面应该再加上判断语句,如果a的长度大于b的长度就先将a赋值进n数字数组里,反之则先将b赋值进n数字数组里。然后就可以把另一个数组里的字符按同样的方法压进n数组里了。
处理进位
先定义一个变量sumn来储存a数组和b数组长度较大的数组的长度,然后循环sumn次。每次判断n[i]是否大于等于10,如果是,那么把n[i]减去10,再把n[i+1]加上1(因为是倒序的)。
处理前导0
如果n[sumn+1]大于0那么我们就可以把长度加1。
最后倒序输出即可
#include<bits/stdc++.h>
using namespace std;
string a,b;
int n[505],sumn;
void f(string a,string b)
{
int ansa=a.size(),ansb=b.size();
sumn=max(ansa,ansb);
if(ansa>ansb)
{
for(int i=1;i<=ansa;i++)
{
n[i]=a[ansa-i]-48;
}
for(int i=1;i<=ansb;i++)
{
n[i]+=b[ansb-i]-48;
}
}
else
{
for(int i=1;i<=ansb;i++)
{
n[i]=b[ansb-i]-48;
}
for(int i=1;i<=ansa;i++)
{
n[i]+=a[ansa-i]-48;
}
}
for(int i=1;i<=sumn;i++)
{
if(n[i]>=10)
{
n[i]-=10;
n[i+1]++;
}
}
if(n[sumn+1]>0)
{
sumn++;
}
for(int i=sumn;i>=1;i--)
{
cout<<n[i];
}
}
int main()
{
cin>>a>>b;
f(a,b);
return 0;
}
标签:10,string,高精度,int,sumn,数组,加法,倒序
From: https://blog.csdn.net/yyds123456789max/article/details/144003748