基本思路
高精度减法与高精度加法的步骤基本一样,都是对齐位数,然后开始减。
不过会遇到很多小细节,需要做好:
sub(a,b) 如果a<b,那么必然应该输出一个负数,可以进行等价转换 a-b = -(b-a),因为后面均假设a>b
减法运算,基本的借位思想要注意
如果a的位数大于b,那么我这里会补充前导0给b,从而方便进行对齐位数的减法
输出结果时,前导0的删除操作
思考如何判断输入的字符串之间的大小
bool flag = false; //判断str1是否小于str2
if((str1<str2&&str1.length()==str2.length())|| str1.length()<str2.length())
{ //如果要用字符串的小于号,则两者必须长度相同才有意义;若str1长度小于str2,则必然小于
swap(str1,str2);
flag = true;
}
实现代码
/*
Author:snnu_lgw
Date:2020/7/3
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string sub(string str1,string str2)
{
string str;
bool flag = false; //判断str1是否小于str2
if((str1<str2&&str1.length()==str2.length())|| str1.length()<str2.length())
{
swap(str1,str2);
flag = true;
}
int len1 = str1.length(),len2 = str2.length();
for(int i=1;i<=len1-len2;i++)//此时,str2的长度必然不大于str1的长度,所以只需要给str2补充前导0即可
str2 = "0"+str2;
for(int i=len1-1;i>=0;i--)
{
int temp = (str1[i]-'0')-(str2[i]-'0');
if(temp<0) //如果相减得到的结果小于0,则要借位
{
str1[i-1] = str1[i-1]-1;
temp+=10;
}
str = char(temp+'0') +str;
}
int len_zero = 0;
int len = str.length();
while(str[len_zero]=='0')
{ //确定前导0的个数
len_zero++;
}
str = str.substr(len_zero,len-len_zero);
if(len_zero == len) str="0";//如果0的个数和数据的长度相同,那么说明这个数必须要输出一个'0',否则会输出一个 空
if(flag)
str = "-"+str;
return str;
}
int main()
{
string str1,str2,str;
cin>>str1>>str2;
str = sub(str1,str2);
cout<<str;
return 0;
}