高精度减法和加法差不多,复杂度O(n),只要解决两个难点即可
1. 结果是负数的情况:自己写一个比较大小的函数,保证是大数减小数,结果为负只要在返回的函数上加一个负号即可
2. 存在前导0的情况:最后算出答案后从后遍历,while循环消除前导0
bool cmp(string a,string b) //比较两个字符串的函数,a>=b返回true,否则返回false
{
if( a.length() > b.length() ) return true;
if( a.length() < b.length() ) return false;
return a > b;
}
string sub(string a,string b)
{
string res,ans;
if( !cmp(a,b) ) //保证大数减小数
{
string temp = a;
a = b;
b = temp;
res += '-';
}
int len1 = a.length()-1;
int len2 = b.length()-1;
while( len1>=0 ) //由于大数减小数,这边保证了len1>=len2
{
int num;
if( len2>=0 ) num = a[len1]-'0'-(b[len2]-'0'); //只要b有的减就减
else num = a[len1]-'0'; //b减完了照抄a即可
if( num < 0 ) //需要借位的情况
{
num += 10;
a[len1-1] -= 1;
}
ans += num+'0';
len1--;
len2--;
}
int len = ans.length()-1;
while( ans[len]=='0' ) //消除前导0
{
len--;
if( len==-1 ) //结果为0的情况
{
res = "0";
break;
}
}
for( int i = len ; i >= 0 ; i-- )
{
res += ans[i];
}
return res;
}