高精度减法题解
2025-12-20 17:43:23
发布于:浙江
#include <bits/stdc++.h>
using namespace std;
//高精度减法
//用大的数字减去小的数字会比较好算
//1.先比较哪个比较大
//如果a比b大,那么结果就是正数
//如果b比a大,那么结果就是负数,交换a,b
bool cmp(string a , string b){
if(a.size() != b.size()){
return a.size() > b.size();
}
else{
return !(a < b);
}
}
//2.翻转字符串,让个位数在字符串的第0位,十位数在字符串的第1位
//方便我们实现减法
string rev(string a){
//返回翻转之后的字符串
string s = "";
//从字符串的最后开始放入到全新的字符串s里面
for(int i = a.size() - 1 ; i >= 0 ; i --){
s += a[i];
//cout << s << endl;
}
return s;
}
//3.从个位开始依次实现竖式减法,存放到字符串里面
string del(string a , string b){
string c = "";
if(a.size() > b.size()){
while(b.size() != a.size()){
b += "0";
}
}
if(b.size() > a.size()){
while(b.size() != a.size()){
a += "0";
}
}
int down = 0;//是否退位
for(int i = 0 ; i < a.size() ; i ++){
int x = a[i] - '0';
int y = b[i] - '0';
int num = x - y - down;
if(num < 0){
num += 10;
down = 1;
}
else{
down = 0;
}
c += (char)(num + '0');
}
return c;
}
//4.求出答案字符串之后,重新倒回来表示正确答案
//5.去除前导零
string move(string a){
//在非0数字之前出现的0都是无效的
int flag = 0;//标记是否发出现非0数字
string s = "";
for(int i = 0 ; i < a.size() ; i ++){
if(a[i] != '0'){
flag = 1;
}
if(flag == 1){
s += a[i];
}
}
if(s.size() == 0){
s = "0";
}
return s;
}
int main() {
string a , b;
cin >> a >> b;
int flag = 0;
if(cmp(a , b) == 0){
flag = 1;
swap(a , b);
}
a = rev(a);
b = rev(b);
string ans = del(a , b);
ans = rev(ans);
if(flag == 1){
cout << "-";
}
ans = move(ans);
cout << ans;
全部评论 2
1
2025-12-20 来自 浙江
01
2025-12-20 来自 浙江
0

有帮助,赞一个