版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/82532350
大整数减法模板如下:
#include <iostream>
#include <cstring>
#include <cctype>
#define SIZE 1001
using namespace std;
bool neg; // 是否为负数
int a[SIZE], b[SIZE], temp[SIZE];
int comp(int a[], int b[]) // 判断大小,a > / = / < b 的情况下,返回值为 1 / 0 / -1
{
int i, la = a[0], lb = b[0];
if (la > lb)
{
return 1;
}
if (la < lb)
{
return -1;
}
for (i = la; i > 0; --i)
{
if (a[i] > b[i])
{
return 1;
}
if (a[i] < b[i])
{
return -1;
}
}
return 0;
}
void _swap(int *a, int *b) // 交换两个数组
{
int i, len = max(a[0], b[0]);
for (i = 0; i <= len; ++i)
{
swap(a[i], b[i]);
}
return;
}
void sub(int a[], int b[]) // 高精度减法,a -= b
{
int i, carry = 0, len;
neg = false;
if (comp(a, b) == -1)
{
neg = true; // 结果为负数
_swap(a, b);
}
len = a[0];
for (i = 1; i <= len; ++i) // 按位相减
{
a[i] -= b[i] + carry;
if (a[i] < 0)
{
a[i] += 10; // 处理借位情况
carry = 1;
}
else
{
carry = 0;
}
}
return;
}
void read(int a[]) // 读入大整数
{
char ch = 'a';
int i;
while (!isdigit(ch))
{
ch = getchar();
}
while (isdigit(ch))
{
temp[++a[0]] = ch - '0'; // 大概是快读的思想
ch = getchar();
}
for (i = 1; i <= a[0]; ++i)
{
a[i] = temp[a[0]-i+1];
}
return;
}
void write(int a[]) // 输出大整数
{
int len = a[0] + 1;
if (neg) // 如果是负数
{
putchar('-'); // 就输出负号'-'
}
while (--len)
{
putchar(a[len] + '0'); // 按位输出
}
return;
}
int main(int argc, char** argv)
{
read(a);
read(b);
sub(a, b);
write(a);
return 0;
}