之所以需要高精度加法,是因为已有的数据类型不足以满足加数和被加数的存储。为了解决数据太长的问题,最核心的思想就是使用字符串来装数据。已知字符串是用ASCII码编码,所以用字符串元素减去48(0的ASCII码),即可取得数值。
另外一点值得注意的是,由于进位的存在,所以我们采用了倒着存储,倒着输出的方式,便于进位。
/*高精度——>用字符串来装数据*/
#include<iostream>
#include<algorithm>//max函数的头文件
#define N 512
using namespace std;
string a, b;
int sa, sb, m;//sa代表string a的长度,sb代表string b的长度,m代表其中较长string的长度
int x[N] = { 0 };
int add(string a, string b)
{
sa = a.size();
sb = b.size();
m = max(sa, sb);
if (sa > sb)//把短的加给长的,把a,b倒着加给x,做倒着存储
{
for (int i = 1;i <= sa;i++)
{
x[i] = a[sa - i] - 48;
}
for (int i = 1;i <= sb;i++)//并不是嵌套循环,所以可以都定义为i
{
x[i] += b[sb - i] - 48;
}
}
else
{
for (int i = 1;i <= sb;i++)
{
x[i] = b[sb - i] - 48;
}
for (int i = 1;i <= sa;i++)
{
x[i] += a[sa - i] - 48;
}
}
//判断每一位是否进位,如进位则保留各位,然后对下一位做+1操作
for (int i = 1;i <= m;i++)
{
if (x[i] >= 10)
{
x[i] = x[i] % 10;//x[i] = x[i] - 10;为另一种写法
x[i + 1]++;
}
}
//判断数据的最高位是否有向前进位,因为是倒着存储,所以在数组的最后一位加1
if (x[m + 1] > 0)
{
m++;
}
//倒着输出,因为是倒着存储的
for (int i = m;i >= 1;i--)
{
cout << x[i];
}
return 0;
}
int main()
{
cin >> a >> b;
add(a, b);
return 0;
}