高精度减法
#include <bits/stdc++.h>
using namespace std;
bool Campare(vector<int>&Num1, vector<int>&Num2)
{
if(Num1.size() != Num2.size())
{
return Num1.size() > Num2.size();
}
else
{
for(int i = Num1.size()-1; i >= 0; i--)
{
if(Num1[i] != Num2[i])
{
return Num1[i] > Num2[i];
}
}
}
return true;
}
vector<int> Sub(vector<int>&Num1, vector<int>&Num2)
{
vector<int>Result;
for(int i = 0; i < Num1.size(); i++)
{
if(i >= Num2.size())
{
if(Num1[i] < 0)
{
Num1[i+1] -= 1;
Num1[i] += 10;
Result.push_back(Num1[i]);
}
else
{
Result.push_back(Num1[i]);
}
}
else
{
if(Num1[i] >= Num2[i])
{
Result.push_back(Num1[i]-Num2[i]);
}
else
{
Num1[i+1] -= 1;
Result.push_back(Num1[i]-Num2[i]+10);
}
}
}
return Result;
}
int main(int argc, char** argv)
{
string szNum1;
string szNum2;
vector<int>Num1;
vector<int>Num2;
cin>>szNum1;
cin>>szNum2;
for(int i = szNum1.size()-1; i >= 0; i--)
{
Num1.push_back(szNum1[i]-'0');
}
for(int i = szNum2.size()-1; i >= 0; i--)
{
Num2.push_back(szNum2[i]-'0');
}
vector<int>Result;
if(Campare(Num1,Num2))
{
Result = Sub(Num1,Num2);
}
else
{
Result = Sub(Num2,Num1);
cout<<"-";
}
int nLen = Result.size()-1;
while(nLen != -1 && 0 == Result[nLen]) nLen--;
for(int i = nLen; i >= 0; i--)
{
cout<<Result[i];
}
if(-1 == nLen)
{
cout<<"0"<<endl;
}
return 0;
}
板子
vector<int> Sub(vector<int> &Num1, vector<int> &Num2)
{
vector<int> Result;
for(int i = 0, nTemp = 0; i < Num1.size(); i++)
{
nTemp = Num1[i] - nTemp;
if(i < Num2.size())
{
nTemp -= Num2[i];
}
Result.push_back((nTemp + 10) % 10);
if(nTemp < 0)
{
nTemp = 1;
}
else
{
nTemp = 0;
}
while(Result.size() > 1 && 0 == Result.back())
{
Result.pop_back();
}
}
return Result;
}