题目链接:高精度减法
题目描述
高精度减法。
输入格式
两个整数 a , b a,b a,b(第二个可能比第一个大)。
输出格式
结果(是负数要输出负号)。
样例 #1
样例输入 #1
2
1
样例输出 #1
1
提示
- 20 % 20\% 20% 数据 a , b a,b a,b 在 long long 范围内;
- 100 % 100\% 100% 数据 0 < a , b ≤ 1 0 10086 0<a,b\le 10^{10086} 0<a,b≤1010086。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
char tmp[MAXN] = {};//交换用字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
int main() {
scanf("%s %s", s1, s2);//读入字符串
int lena = strlen(s1);
int lenb = strlen(s2);
//判断最终的结果符号
if ((lena<lenb) || (lena==lenb && strcmp(s1,s2)<0)) {
//被减数小于减数,结果为负数
printf("-");
//交换数据
strcpy(tmp, s1);
strcpy(s1, s2);
strcpy(s2, tmp);
//更新长度数据
lena = strlen(s1);
lenb = strlen(s2);
}
//将字符串写入到数组A中
for (int i=0; i<lena; i++) {
//倒序写入
a[i] = s1[lena-i-1] - '0';
}
//将字符串写入到数组B中
for (int i=0; i<lenb; i++) {
//倒序写入
b[i] = s2[lenb-i-1] - '0';
}
//模拟竖式减法
for (int i=0; i<lena; i++) {
if (a[i]<b[i]) {
//有借位
a[i+1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
//删除前导零
for (int i=lena-1; i>=0; i--) {
//因为我们是从索引 0 开始,所以最高位是保存在 len-1
if (0==c[i] && lena>1) {
//注意要有 lena>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
lena--;
} else {
//第一个不是零的最高位,结束删除
break;
}
}
//逆序打印输出
for (int i=lena-1; i>=0; i--) {
printf("%d", c[i]);
}
printf("\n");
return 0;
}