本篇介绍大整数相减(两个正数相减)
与大整数加法运算相比,减法运算稍微复杂了些,因为要考虑当结果为负数时候的情况。根据减法运算法则可以得出两个整数相减为正数的情况。这样想来,只需要在两个正的大整数相减前比较大小即可得出另外一种情况。
例:
- 11 - 20 = - ( 20 - 11)只需算出 20 - 11 即可获得答案
- 为了确定最终结果得符号(+ / -),需要比较两个数得大小
所以最终功能的实现由以下部分组成:
- 逆序存放数字(对齐整数的个位,便于计算)
- 判断两个整数大小(确定最终结果为正数还是负数)
- 用数组计算结果
- 根据两个整数的大小输出结果
#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]);
}
}
int main()
{
int a[1001] = { 0 };
int b[1001] = { 0 };
string A, B;
cin >> A >> B;
int len1, len2;
len1 = A.length();
len2 = B.length();
int flag = 0;//标记输出结果为正或是负
for (int i = len1 - 1, k = 0; i != -1; i--)//逆序存放
{
a[k] = A[i] - '0';
k++;
}
for (int i = len2 - 1, k = 0; i != -1; i--)
{
b[k] = B[i] - '0';
k++;
}
if (len1 < len2)//比较大小
{
flag = 1;
swap(a, len1, b, len2);
swap(len1, len2);
}
else if (len1 == len2)
{
for (int i = len1 - 1; i >= 0; i--)
{
if (a[i] == b[i])
continue;
else if (a[i] > b[i])
break;
else
{
flag = 1;
swap(a, len1, b, len2);
swap(len1, len2);
break;
}
}
}
int down = 0,max = len1 >= len2 ? len1 : len2;
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];
}
return 0;
}