大整数加减法
大整数加法
大整数减法
本篇将以上两部分内容结合,使之能够真正计算大整数的加减法。
大整数加法介绍了两个正的大整数相加,大整数减法介绍了两个正的大整数相减。
加法
加法有以下情况,它们都可以转换为以上链接讲述的问题:
- 正 + 正 ,如 1 + 1
- 正 + 负,如 1 + (-1) = 1 - 1
- 负 + 正,如 -1 + 1 = 1 - 1
- 负 + 符,如 -1 + -1 = -(1 + 1)
减法
同理,减法有如下情况:
- 正 - 正,如:1 - 1
- 正 - 负,如1 - (-1) = 1 + 1
- 负 - 正,如 -1 - 1 = -(1 + 1)
- 负 - 负,-1 - (-1) = 1 - 1
根据以上规则,有如下代码:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
void swap(int a[], int len_a, int b[], int len_b)//交换数组
{
int MAX = max(len_a, len_b);
for (int i = 0; i < MAX; i++)
{
swap(a[i], b[i]);
}
}
void reverseArr(string A, int a[])//逆序存放
{
int len = A.length();
for (int i = len - 1, k = 0; i != -1; i--)
{
a[k] = A[i] - '0';
k++;
}
}
void largeIntAdd(string A,string B)
{
int a[1001] = { 0 };
int b[1001] = { 0 };
reverseArr(A, a);
reverseArr(B, b);
int len_a = A.length();
int len_b = B.length();
int up = 0, max = len_a >= len_b ? len_a : len_b;
for (int i = 0; i < max; i++)//模拟加法
{
a[i] += b[i] + up;
up = a[i] / 10;
a[i] %= 10;
}
if (up > 0)
{
a[max] += up;
max += 1;
}
for (int i = max - 1; i >= 0; i--)
{
cout << a[i];
}
cout << endl;
}
void largeIntSub(string A,string B)
{
int a[1001] = { 0 };
int b[1001] = { 0 };
reverseArr(A, a);
reverseArr(B, b);
int len_a = A.length();
int len_b = B.length();
int flag = 0;
int count = 0;
if (len_a < len_b)
{
flag = 1;
swap(a, len_a, b, len_b);
swap(len_a, len_b);
}
else if (len_a == len_b)
{
for (int i = len_a - 1; i >= 0; i--)
{
if (a[i] == b[i])
{
count++;
continue;
}
else if (a[i] > b[i])
break;
else
{
flag = 1;
swap(a, len_a, b, len_b);
swap(len_a, len_b);
break;
}
}
}
if (len_a == len_b && count == len_a)
{
cout << 0 << endl;
return;
}
int down = 0, max = len_a >= len_b ? len_a : len_b;
for (int i = 0; i < max; i++)//模拟减法
{
a[i] = a[i] - b[i] - down;
down = 0;
if (a[i] < 0)
{
down = 1;
a[i] += 10;
}
}
if (flag)
{
cout << "-";
}
int i;
for (i = max - 1; a[i] == 0; i--);//忽略空格
for (; i >= 0; i--)
{
cout << a[i];
}
cout << endl;
}
int control(string &A, char op, string &B)//控制调控函数
{
switch (op)
{
case '+':
{
if (A[0] == '-'&&B[0] == '-')//负+负 = -(正 + 正)
{
A.erase(0, 1);
B.erase(0, 1);
cout << "-";
largeIntAdd(A, B);
}
else if (A[0] == '-'&&B[0] != '-')//一负一正
{
A.erase(0, 1);
largeIntSub(B, A);
}
else if (A[0] != '-'&&B[0] == '-')//一正一负
{
B.erase(0, 1);
largeIntSub(A, B);
}
else//双正
{
largeIntAdd(A, B);
return 0;
}
break;
}
case '-':
{
if (A[0] != '-')
{
if (B[0] != '-')//正 - 正
{
largeIntSub(A, B);
}
else//正 - 负
{
B.erase(0, 1);
largeIntAdd(A, B);
}
}
else
{
if (B[0] != '-')//负 - 正
{
A.erase(0, 1);
cout << "-";
largeIntAdd(A, B);
}
else//负 - 负
{
A.erase(0, 1);
B.erase(0, 1);
largeIntSub(B, A);
}
}
}
default:
return -1;
}
return 0;
}
int main()
{
string A, B;
char op;
while (cin >> A >> op >> B)
{
control(A, op, B);
}
}
效果如下: