洛谷P2142高精度减法题解
P2142 高精度减法
题目描述
高精度减法。
输入格式
两个整数 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。
错误示范
这题,可不是平常我们开个long long
就可以通过的简单的减法题目:
#include<bits/stdc++.h>
using namespace std;
long long a, b;
int main(){cin >> a >> b;cout << a - b;return 0;
}
结果:
这是因为题目说
100 % 100\% 100% 数据 0 < a , b ≤ 1 0 10086 0<a,b\le 10^{10086} 0<a,b≤1010086
但是我们开的long long
只可以保存到第 19 19 19 位。
题目的数据范围可是 1 1 1 后面跟着 10087 10087 10087 个 0 0 0 啊!
让我们重新审视一下这道题目:
- 题目的数据范围很大,所以可以使用字符串来保存输入的两个超大数。
- 虽然数据范围很大,但也只不过是 1 0 10086 10^{10086} 1010086 ,可以用数组记录每个位(末尾对齐,所以要倒着记录)。
- 记录之前要前判断一下是不是负数,是负数的话就交换两个字符串然后先输出一个负号。
- 记录完之后运算的时候要考虑一下借位。
- 运算完还要循环去掉前导零,因为如果零在数字开头在数学界是违规的!
- 最后倒着输出就可以了!!!!
你们最喜欢的代码区!
#include<bits/stdc++.h>
#define int long long
using namespace std;
string str1, str2;
int a[20000], b[20000], len1, len2, len;
int check(string a, string b){if(a.size() > b.size()) return 1;if(a.size() < b.size()) return -1;for(int i = 0; i < a.size(); i ++){if(a[i] > b[i]) return 1;if(a[i] < b[i]) return -1;}return 0;
}
signed main(){cin >> str1 >> str2;if(check(str1, str2) == -1){swap(str1, str2);cout << '-';}len1 = str1.size();len2 = str2.size();len = max(len1, len2);for(int i = 0; i < len1; i ++){a[len1 - i] = str1[i] - '0';}for(int i = 0; i < len2; i ++){b[len2 - i] = str2[i] - '0';}for(int i = 1; i <= len; i ++){a[i] = a[i] - b[i];if(a[i] < 0){a[i + 1] --;a[i] += 10;}}while(a[len] == 0 && len > 1)len --;for(int i = len; i >= 1; i --)cout << a[i];return 0;
}
AC了!
求关注!求点赞!求评论!