高精度除法
今天尝试写了高精度除法(n进制),感觉不错,只有一处一开始没有注意到,后来才看书发现,见注释。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 100005
using namespace std;
int n,a[MAXN],b[MAXN],c[MAXN],tmp[MAXN];
char dc[MAXN];
void init(int a[])
{
a[0]=strlen(dc);
for(int i=1;i<=a[0];i++)
{
if(dc[a[0]-i]>='0'&&dc[a[0]-i]<='9')
a[i]=int(dc[a[0]-i])-'0';
else a[i]=int(dc[a[0]-i])-'A'+10;
}
}
int com(int a[],int b[])
{
if(a[0]<b[0])return -1;
if(a[0]>b[0])return 1;
for(int i=a[0];i>0;i--)
{
if(a[i]>b[i])return 1;
if(a[i]<b[i])return -1;
}
return 0;
}
void print(int a[])
{
if(a[0]==0)
{
printf("0\n");return;
}
for(int i=a[0];i>0;i--)
printf("%d",a[i]);
printf("\n");
}
void add(int a[],int b[],int det)//在b第det位开始复制a
{
b[0]=det+a[0]-1;
for(int i=det;i<=b[0];i++)
b[i]=a[i-det+1];
}
void jian(int a[],int b[])//a-b
{
if(com(a,b)==0)
{
a[0]=0;return;
}
for(int i=1;i<=a[0];i++)
{
if(a[i]<b[i])a[i]+=n,a[i+1]--;
a[i]-=b[i];
}
}
void chugao(int a[],int b[])//a/b
{
if(com(a,b)<0)
{
c[0]=1;c[1]=0;return;
}
if(com(a,b)==0)
{
c[0]=1;c[1]=1;a[0]=0;return;
}
c[0]=a[0]-b[0]+1;
for(int i=a[0]-b[0]+1;i>0;i--)
{
memset(tmp,0,sizeof tmp);//!!!否则com时会出错
add(b,tmp,i);
while(com(a,tmp)>=0)
{
jian(a,tmp);
c[i]++;
// for(int i=a[0];i>0;i--)
// {
// if(a[i]==0)a[0]--;
// else break;
// }
while(a[0]>0&&a[a[0]]==0)a[0]--;
}
}
while(c[0]>0&&c[c[0]]==0)c[0]--;
// c[0]=1;
// while(c[c[0]]==0)c[0]++;
}
int main()
{
cin>>n;
cin>>dc;
init(a);
cin>>dc;
init(b);
chugao(a,b);
// for(int i=a[0]-b[0]+1;i>=c[0];i--)
// printf("%d",c[i]);
// printf("\n");
// for(int i=a[0];i>0;i--)
// printf("%d",a[i]);
print(c);
print(a);
return 0;
}

浙公网安备 33010602011771号