|
#include <bits/stdc++.h>
using namespace std;
string sa,sb,c="",r,b19[10],ta="";//sa被除数sb除数sc结果r余数ta新被除数
void getb19();//计算除数的1-9倍
bool isbig(string ,string);//字符串代表的数字比大小
string add(string ,string);//高精度加
string sub(string ,string);//高精度减
void getb19()
{
b19[0]="0",b19[1]=sb;
for(int i=2;i<=9;i++)
b19[i]=add(b19[i-1],sb);
}
bool isbig(string x,string y)
{
if(x.size()==y.size()) return x>y;
return x.size()>y.size();
}
string add(string x,string y)//高精度加
{
int qq[100000],ww[100000],ee[100000];
int lenx,leny,lenz;
string z="";
memset(qq,0,sizeof(qq));
memset(ww,0,sizeof(ww));
memset(ee,0,sizeof(ee));
lenx=x.size();
leny=y.size();
for(int i=0;i<=lenx-1;i++)
qq[i]=x[lenx-1-i]-'0';
for(int i=0;i<=leny-1;i++)
ww[i]=sb[leny-1-i]-'0';
lenz=0;
int tx=0;
while(lenz<=lenx-1||lenz<=leny-1)
{
ee[lenz]=qq[lenz]+ww[lenz]+tx;
tx=ee[lenz]/10;
ee[lenz]%=10;
lenz++;
}
ee[lenz]=tx;
if(ee[lenz]==0)
lenz--;
for(int i=0;i<=lenz;i++)
z=z+char(ee[lenz-i]+'0');
return z;
}
string sub(string x,string y)//高精度减
{
int qq[100000],ww[100000],ee[100000];
int lenx,leny,lenz;
string z="",s;//schange
memset(qq,0,sizeof(qq));
memset(ww,0,sizeof(ww));
memset(ee,0,sizeof(ee));
lenx=x.size();
leny=y.size();
for(int i=0;i<=lenx-1;i++)
qq[i]=x[lenx-1-i]-'0';
for(int i=0;i<=leny-1;i++)
ww[i]=y[leny-1-i]-'0';
lenz=0;
while(lenz<=lenx-1||lenz<=leny-1)
{
if(qq[lenz]<ww[lenz])
{
qq[lenz]+=10;
qq[lenz+1]--;
}
ee[lenz]=qq[lenz]-ww[lenz];
lenz++;
}
while((ee[lenz]==0)&&lenz>0)
lenz--;
for(int i=0;i<=lenz;i++)
z=z+char(ee[lenz-i]+'0');
return z;
}
int main()
{
int lena,lenb;
cin>>sa>>sb;
lena=sa.size();
lenb=sb.size();
getb19();
r=sa.substr(0,lenb-1);
for(int p=lenb-1;p<=lena-1;p++)
{
if(r=="0") ta=sa[p];
else ta=r+sa[p];
int k=9;
while(isbig(b19[k],ta)) k--;//如果比新被除数大就小一倍
c=c+char(k+'0');
r=sub(ta,b19[k]);
}
while(c[0]=='0'&&c.size()>1) c.erase(0,1);
while(r[0]=='0'&&r.size()>1) r.erase(0,1);
cout<<c;
return 0;
} |
|