题目描述
输入两个高精度数(位数<255),计算它们的差并输出结果
输入格式
两行每行一个数表示输入的两个高精度数
输出格式
一个数表示它们的差
样例
【样例输入1】
41829471293481374154
83497239842398434
【样例输出1】
41745974053638975720
【样例输入2】
83497239842398434
41829471293481374154
【样例输出2】
-41745974053638975720
题解:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 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;
}