高精度除法,其实还是模拟,不过需要结合高精度加法、减法进行模拟
#include<iostream>
#include<string>
using namespace std;
string rev(string a)
{
string ret=a;
int n=a.size();
for(int i=0;i<n/2;i++)
{
swap(ret[i],ret[n-i-1]);//得到逆序字符串
}
return ret;
}
string add(string a,string b)//大整数加法
{
int lena=a.size();
int lenb=b.size();
a=rev(a);
b=rev(b);
int carry=0;
string c;
int i;
for(i=0;i<lena&&i<lenb;i++)
{
int ai=a[i]-'0';
int bi=b[i]-'0';
int ci=ai+bi+carry;
c+=(ci%10)+'0';//(ci%10)+'0'整体是一个字符,即(char)((ci%10)+'0')
carry=ci/10;
}
for(;i<lena;i++)
{
int ai=a[i]-'0';
int ci=ai+carry;
c+=(ci%10)+'0';
carry=ci/10;
}
for(;i<lenb;i++)
{
int bi=b[i]-'0';
int ci=bi+carry;
c+=(ci%10)+'0';
carry=ci/10;
}
if(carry==1) c=c+'1';
return rev(c);
}
string sub(string a,string b)
{
int lena=a.size();
int lenb=b.size();
if(lena<lenb||(lena==lenb&&a<b)) return "";
a=rev(a);
b=rev(b);
int carry=0;
string c;
int i;
for(i=0;i<lena&&i<lenb;i++)
{
int ai=a[i]-'0';
int bi=b[i]-'0';
int ci=ai-bi-carry;
if(ci<0)
{
ci+=10;
carry=1;
}
else carry=0;
c+=(ci%10)+'0';
}
for(;i<lena;i++)
{
int ai=a[i]-'0';
int ci=ai-carry;
if(ci<0)
{
ci+=10;
carry=1;
}
else carry=0;
c+=(ci%10)+'0';
}
int lenc=c.size();
for(i=c.size()-1;i>=0;i--)
{
if(c[i]=='0') lenc--;
else break;
}
if(lenc==0) return "";
c=c.substr(0,lenc);
return rev(c);
}
string divide(string a,string b)
{
int lena=a.size();
int lenb=b.size();
if(lena<lenb||(lena==lenb&&a<b)) return "0";
string bt[11];
bt[0]="";
bt[1]=b;
for(int j=2;j<=10;j++)//除法的条件限制每一位的商不可能>=10
{
bt[j]=add(bt[j-1],bt[1]);
}
int i=lenb-1;
string c;
string now=a.substr(0,lenb);
if(now<b)
{
now+=a[++i];//除法相当于多次减法,这样表示++i程序更快
}
for(;i<lena;i++)
{
int ci;
int len_now=now.size();
for(ci=1;ci<=10;ci++)
{
int lbn=bt[ci].size();
if(lbn>len_now||(lbn==len_now&&bt[ci]>now)) break;//除不下去了就跳出循环
}
ci--;//看有几个数能被减,因为ci时跳出循环,所以不算在内,需要减一
c+=ci+'0';
now=sub(now,bt[ci]);
if(i<lena-1)
{
if(now.size()==0&&a[i+1]=='0') continue;
now+=a[i+1];
}
}
return c;
}
int main()
{
string a,b;
cin>>a>>b;
cout<<divide(a,b)<<endl;
}