对于一些比long int还大的数,我们应该如何计算加法呢?
可以想到的是可以转换为字符串去计算。
思路:
1,逆序输入
2,加法
1)主要就是考虑进位。
比如我们计算987654321 + 5678
对于高位不足的我们补0
最后结果在逆序输出就行了
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
8 | 7 | 6 | 5 | 0 | 0 | 0 | 0 | 0 |
9 | 9 | 9 | 9 | 5 | 6 | 7 | 8 | 9 |
但是如果我们计算的加法中有负数应该怎么办?
那可以看成减法去计算。
注意考虑负号就行了
当然在这里我们也没必要在重新生成一个数组去计算。
下面是代码实现
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxn = 1000;
char str1[maxn], str2[maxn];
int a[maxn], b[maxn];
void input()
{
int i, j;
//逆序输入
for (i = strlen(str1) - 1, j = 0; i >= 0; i--)
a[j++] += str1[i] - '0';
for (i = strlen(str2) - 1, j = 0; i >= 0; i--)
b[j++] += str2[i] - '0';
}
void add()
{
int i;
//相加和进位
for (i = 0; i < maxn; i++) {
b[i] += a[i];
if (b[i] >= 10) {
b[i + 1] += b[i] / 10;
b[i] %= 10;
}
}
}
void sub()
{
int i, j;
//相减和借位
for (i = 0; i < maxn; i++) {
if (a[i] < b[i]) {
b[i] = a[i] + 10 - b[i];
a[i + 1] -= 1;
}
else b[i] = a[i] - b[i];
}
}
void print()
{
int i;
//过滤前置的0
for (i = maxn - 1; i >= 0 && b[i] == 0; i--);
if (i >= 0)
for ( ; i >= 0; i--)
cout << b[i];
else cout << 0;//如果前面全为0,那么输出1个0;
cout << endl;
}
int main()
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(str1, 0, sizeof(str1));
memset(str2, 0, sizeof(str2));
cin >> str1 >> str2;
if (str1[0] != '-' && str2[0] != '-') {
input();
add();
print();
}
else if(str1[0] != '-' && str2[0] == '-') {
for (int i = 0; i <= maxn; i++) {
str2[i] = str2[i+1];
}
input();
sub();
print();
}
else if (str1[0] == '-' && str2[0] != '-') {
for (int i = 0; i <= maxn; i++) {
str1[i] = str1[i+1];
}
input();
sub();
cout << '-';
print();
}
else {
for (int i = 0; i <= maxn; i++) {
str1[i] = str1[i+1];
str2[i] = str2[i+1];
}
input();
add();
cout << '-';
print();
}
return 0;
}