思路:
用字符串输入a,b(如a=“12345”),用vector数组A,B 倒着储存a,b(A={5,4,3,2,1}),因为减法是由个位算起。
用t代表借位,初始t=0,t先赋值A[i]-t,然后t-b[i],把相减之后的数存入vector<int>C,该数为(t+10)%10 例如 8-4=4 ,4+10=14%10=4; 4-8=-4 -4+10=6%10=6
而后判断借位,如果t<0 说明小减大,说明要借位 ,t赋值为1,下一个循环t=A[i]-1; 如果t>0,则说明不借位,t赋值为0,下一个循环t=A[i]-0;
算到最后一位时,在总位数大于1的情况下,如果此位的数为0 则要把0抹去,例如99-90=09,0抹去=9;(如果总位数=1,例如9-9=0,则这个零不抹,所以总位数要大于1)
而后要判断a,b的大小(a,b都正数)
如果a的位数小于b,则b>a ,要加负号
如果a的位数等于b,进一步判断,a的第一位与b的第一位,若相等继续遍历,若不等则判断大小。
/*
44444
32
*/
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
string a,b;
vector<int> div(vector<int> &A,vector<int> &B)
{
vector<int> C;
for(int i=0,t=0;i<A.size()||i<B.size();i++)
{
t=A[i]-t;
if(i<B.size()) t=t-B[i];// 8-4 4 4-8 = -4 -4+10=6 %10 =6
C.push_back((t+10)%10);
if(t<0) t=1;//下一次循环剪去借位的1;
else t=0;
}
while(C.size()>1&&C.back()==0) C.pop_back();// 如果 C为 12320,结果则为02321, 删除最后一位 结果则为2321 如果C为 10,则删0 为1,如果结果为0,则是输出0;
return C;
}
int main()
{
cin>>a>>b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;i--)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--)
B.push_back(b[i]-'0');
if(a.size()<b.size())
{
auto c=div(B,A);
cout<<"-";
for(int i=c.size()-1;i>=0;i--)
{
cout<<c[i];
}
return 0;
}
if(a.size()==b.size())
{
for(int i=a.size();i>=0;i--)
{
if(A[i]!=B[i])//如果等于则继续遍历 ,334 335 前两次都继续遍历 到3!=4 停止 3<4 所以 -
{
if(A[i]<B[i])
{
auto c=div(B,A);
cout<<"-";
for(int i=c.size()-1;i>=0;i--)
{
cout<<c[i];
}
return 0;
}
else
{
auto c=div(A,B);
for(int i=c.size()-1;i>=0;i--)
{
cout<<c[i];
}
return 0;
}
}
}
}
auto c=div(A,B);
for(int i=c.size()-1;i>=0;i--)
{
cout<<c[i];
}
return 0;
}