1. 程式人生 > >高精度除法

高精度除法

printf true () oid return names cstring -- ==

今天嘗試寫了高精度除法(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;
}

  

高精度除法