题目描述
高精度减法。
输入格式
两个整数 a,b(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
输入输出样例
输入
2
1
输出
1
说明/提示
20
%
20\%
20% 数据 a,b 在 long long 范围内;
100
%
100\%
100% 数据
0
<
a
,
b
≤
1
0
10086
0<a,b\le 10^{10086}
0<a,b≤1010086
#include<algorithm>
#include<string.h>
#include<iostream>
#include<stdio.h>
#define maxn 10500
using namespace std;
char a[maxn],b[maxn];
int A[maxn],B[maxn],ans[maxn];
// 高精度减
void sub(char a[],char b[],bool flag)
{
int alen=strlen(a),blen=strlen(b);
int len=alen>blen?alen:blen;
// 把字符转成一位位数字,并且低位在前
for(int i=0;i<alen;i++)
A[i]=a[alen-i-1]-'0';
for(int i=0;i<blen;i++)
B[i]=b[blen-i-1]-'0';
// 减法
for(int i=0;i<len;i++)
{
// 借位
if(A[i]<B[i])
{
A[i+1]--;
A[i]+=10;
}
ans[i]=A[i]-B[i];
}
// 高位为0,--,去掉0
while (ans[len-1]==0)
len--;
// len<0,说明所以0都减掉了,输出0
if(len<0)
{
printf("0");
return;
}
// 输出负号
if(flag==false)
printf("-");
for(int i=len-1;i>=0;i--)
printf("%d",ans[i]);
}
int main()
{
bool flag=true;
//输入
scanf("%s %s",a,b);
//判断结果正负
//a<b,交换a,b
if(strcmp(a,b)<0 && strlen(a)==strlen(b)||strlen(a)<strlen(b))
{
flag=false;
swap(a,b);
}
sub(a,b,flag);
return 0;
}