对于输入的两个不超过100位数字的非负整数,给出两数之和。
输入格式:
在两行中分别给出两个不超过100位数字的非负整数
输出格式:
在一行中输出两数之和
123
12
输出样例:
135
高精度加法,顾名思义,就是位数很多的两个数相加。
既然位数很多,就不能用longlong来存储了!
应该先输入字符串,再把字符串转化为数字,放在数组之中。
这个过程交给一个函数完成,就叫这个函数cinit();
之后再 定义两个string(当然要先引入头文件)ac,bc;
之后,再定义两个整形数组,来把数一位一位的储存起来。
先让定义的两个数组各项为0
之后,还要记录位数,所以把这两个整形
长这样子:
void cinit()
{
cin >> ac >> bc;
a[0] = ac.size();
b[0] = bc.size();
for (int i = 1; i <= a[0]; i += 1)
{
a[i] = ac[a[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
for (int i = 1; i <= b[0]; i += 1)
{
b[i] = bc[c[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
}
之后,再进行一位一位的相加,同时注意进位。
其实进位问题很好处理,只需要和10比较。
同时建立一个数组,来进行存储相加之后的结果。
不过注意,这个数组的位数可能是比a和b这两个数组中最大的多1的,因为有进位的情况
一位一位相加的过程交给work()实现:
void work()
{
c[0] = (a[0] > b[0]) ? a[0] : b[0];
for (int i = 1; i <= c[0]; i += 1)
{
c[i] = a[i] + b[i];
if (c[i] >= 10)
{
c[i] %= 10;
c[i + 1] += 1;
}
}
}
之后,就在将刚刚用于存储结果的数列进行倒叙输出,不过注意前导0的问题,也即是输出的第一项不可以为0;
这个交给coutit()来实现:
void coutit()
{
if (c[c[0] + 1] != 0)
{
cout << c[c[0] + 1];
}
for (int i = c[0]; i > 1; i -= 1)
{
cout << c[i];
}
}
最后就是这样子啦!
#include <iostream>
#include <string>
using namespace std;
int a[201];
int b[201];
int c[201];
string ac, bc;
void cinit();
void work();
void coutit();
int main()
{
for (int& x : a)
{
x = 0;
}
for (int& x : b)
{
x = 0;
}
for (int& x : c)
{
x = 0;
}
cinit();
work();
coutit();
return 0;
}
void cinit()
{
cin >> ac >> bc;
a[0] = ac.size();
b[0] = bc.size();
for (int i = 1; i <= a[0]; i += 1)
{
a[i] = ac[a[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
for (int i = 1; i <= b[0]; i += 1)
{
b[i] = bc[b[0] - i] - '0'; // 因为要保证个位与个位相加,所以要倒叙存放位数
}
}
void work()
{
c[0] = (a[0] > b[0]) ? a[0] : b[0];
for (int i = 1; i <= c[0]; i += 1)
{
c[i] += a[i] + b[i];
if (c[i] >= 10)
{
c[i] %= 10;
c[i + 1] += 1;
}
}
}
void coutit()
{
if (c[c[0] + 1] != 0)
{
cout << c[c[0] + 1];
}
for (int i = c[0]; i >= 1; i -= 1)
{
cout << c[i];
}
}