题目描述
高精度减法
输入输出格式
输入格式:两个整数a,b(第二个可能比第一个大)
输出格式:结果(是负数要输出负号)
输入输出样例
说明
20%数据a,b在long long范围内
100%数据0<a,b<=10的10000次方
注释很详细,您一定看得懂
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define Maxn 10005
char a1[Maxn];
char b1[Maxn];
int c[Maxn];
int a[Maxn];
int b[ Maxn ];
int main()
{
cin >> a1 >> b1;
//特判一下是否相等
int flag = strcmp(a1, b1);
if (!flag)
{
cout << 0;
return 0;
}
int lena = strlen(a1);
int lenb = strlen(b1);
//判断a和b哪个大,a大flag=1,a小flag=-1
if (lena > lenb)
flag = 1;
else if (lena < lenb)
flag = -1;
else if (lena == lenb)
{
int x = 0;
while (x < lena || x < lenb)
{
if (a1[x] == b1[x])
{
x++;
continue;
}
else
if (a1[x] < b1[x])
{
flag = -1;
break;
}
else if (a1[x]>b1[x])
{
flag = 1;
break;
}
}
}
//判断a和b哪个大,a大flag=1,a小flag=-1
//如果a小,两数交换,相应的长度交换
if (flag <0)
{
char tmp[Maxn];
strcpy(tmp, a1);
strcpy(a1, b1);
strcpy(b1, tmp);
int tmps = lena;
lena = lenb;
lenb = tmps;
}
//将两数赋值到int型数组,逆序存储
for (int i = 0; i <= lena - 1; i++)
a[lena-i] = a1[i] - '0';
for (int i = 0; i <= lenb - 1; i++)
b[lenb - i] = b1[i] - '0';
//模拟手工减法
int lenc = 1;
int x = 0;
while (lenc <= lena || lenc <= lenb)
{
c[lenc] = a[lenc] - b[lenc]-x;
if (c[lenc] < 0)
{
c[lenc] = 10+c[lenc];
x = 1;
}
else
x = 0;
lenc++;
}
//循环结束后,lenc=max(lena,lenb)+1,所以要lenc--,不信可以手动试试
lenc--;
//输出负号
if (flag < 0)
cout << '-';
//逆序输出
for (int i = lenc; i >= 1; i--)
{
cout << c[i];
}
return 0;
}