#高精度除法与高精度取模
高精度除法与高精度取模是建立在高精度减法上的,但是赛场上一般不会用C/C++去处理高精度,因为模板太长了,还容易出错,所以赛场一般使用Java或者Python处理高精度。这里记录这个模板仅仅是学习一下思维。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int numa[100005],numb[100005],r[100005];
int sub(int *numa,int *numb,int la,int lb)//高精度减法
{
if(la<lb)
return -1;//a比b小
if(la==lb)
{
for(int i=la-1;i>=0;i--)
{
if(numa[i]>numb[i])
break;
else if(numa[i]<numb[i])//说明a比b小
return -1;
}
}
for(int i=0;i<la;i++)//减法
{
numa[i]-=numb[i];
if(numa[i]<0)
{
numa[i]+=10;
numa[i+1]--;
}
}
for(int i=la-1;i>=0;i--)
if(numa[i])
return i+1;//相减后a还剩下i+1位
return 0;//减后a为0;
}
string di(string a,string b,int nn)//a是被除数,b是除数
//nn决定返回商还是余数
{
int la=a.size(),lb=b.size(),tp=la;
for(int i=0;i<la;i++)
numa[i]=a[la-i-1]-'0';//倒置存数组
for(int i=0;i<lb;i++)
numb[i]=b[lb-i-1]-'0';
if(la<lb||(la==lb&&a<b))//除数大于被除数
{
if(nn==1)
return "0";//商
if(nn==2)
return a;//余数
}
int t=la-lb;//a与b的位数差
for(int i=la-1;i>=0;i--)//把b扩大10^t倍
{
if(i>=t)
numb[i]=numb[i-t];
else
numb[i]=0;
}
lb=la;//扩大后b与a的位数就一样了
for(int i=0;i<=t;i++)
{
int temp;
while((temp=sub(numa,numb+i,la,lb-i))>=0)
{
la=temp;//减完之后a的位数
r[t-i]++;//存商
}
}
int cnt=10000;
while(!r[cnt])
cnt--;
string s,v;//s存商,v存余数
while(cnt>=0)
s+=r[cnt--]+'0';
cnt=tp;//原来a的位数
while(!numa[cnt])
cnt--;
while(cnt>=0)
v+=numa[cnt--]+'0';//最后剩余的数就是余数
if(v.empty())
v="0";
if(nn==1)
return s;
if(nn==2)
return v;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string a,b;
cin>>a>>b;
cout<<di(a,b,1)<<endl;
return 0;
}