高精度加法

使用数组存储每个数字的每个位数,对于两个输入的超长整数字符串,程序能够在逐位相加时实现进位。最后将结果再次转化为字符串输出。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<iostream> 
#include<cstring>

using namespace std;

/* 将两个字符串翻转存储到数组中 */
void rev(int fir[], int sec[], string a, string b)
{
for(int i = 0; i < a.length(); i++)
{
// 将第一个字符串翻转存储到 fir 数组中
fir[i] = a[a.length() - i - 1] - '0';
}
for(int i = 0; i < b.length(); i++)
{
// 将第二个字符串翻转存储到 sec 数组中
sec[i] = b[b.length() - i - 1] - '0';
}
}

/* 取两个数的最大值 */
bool max(int a, int b)
{
return a > b ? a : b;
}

int main()
{
string a, b;
int fir[202], sec[202], ans[202] ;
int i, x, len;

// 循环读入两个字符串并进行加法,直到输入结束
while (cin >> a >> b)
{
// 初始化数组
len = max(a.length(), b.length()); // 数组长度为两个字符串长度的最大值
for(i = 0; i <= len; i++)
{
fir[i] = 0;
sec[i] = 0;
ans[i] = 0;
}

// 将两个字符串翻转并存储到数组中
rev(fir, sec, a, b);

x = 0;
// 将两个数组中的数位相加并存储在新的数组中
for(i = 0; i <= len; i++)
{
ans[i] = fir[i] + sec[i] + x; // 将每一位相加
x = ans[i] / 10; // x 为进位
ans[i] %= 10; // ans 数组中只存储个位数
}

// 若最高位为 0,则长度减 1
if(ans[len] == 0)
{
len--;
}

// 将结果输出
for(int i = len; i >= 0; i--)
{
cout << ans[i];
}
cout << endl;
}
}

杂谈

这段代码实现了高精度加法的功能。

具体来说,代码中使用两个整型数组存储要相加的两个大整数,然后将这两个数组中的元素从低位到高位逐位相加,进位等操作都通过简单的循环结构实现。

这种方法的好处在于可以适用于任意长度的大整数,而不受固定长度的限制。