大整数除法

//大整数除法
#include<stdio.h>
#include<string.h>

#define MAX_LEN 200

char szLine1[MAX_LEN+10];
char szLine2[MAX_LEN+10];

int an1[MAX_LEN+10];
int an2[MAX_LEN+10];

int aResult[MAX_LEN+10];
int Substract(int *p1,int *p2,int nLen1,int nLen2)//返回值代表结果的长度 
{
	int i;
	if(nLen1<nLen2) return -1;
	bool bLarger=false;
	if(nLen1==nLen2)
	{
		for(i=nLen1-1;i>=0;i--)
		{
			if(p1[i]>p2[i])
				bLarger=true;
			else if(p1[i]<p2[i]){
				if(!bLarger)
					return -1;
			}
		}
	}
	for(i=0;i<nLen1;i++)
	{
		p1[i]-=p2[i];
		if(p1[i]<0)
		{
			p1[i]+=10;
			p1[i+1]--;
		}
	}
	for(i=nLen1-1;i>=0;i--)
		if(p1[i])
			return i+1;
	return 0;
}
int main()
{
	int t,n;
	scanf("%d",&n);
	for(t=0;t<n;t++)
	{
		scanf("%s",szLine1);
		scanf("%s",szLine2);
		int i,j;
		memset(an1,0,sizeof(an1));
		memset(an2,0,sizeof(an2));
		memset(aResult,0,sizeof(aResult));
		int nLen1=strlen(szLine1);
		j=0;
		for(i=nLen1-1;i>=0;i--)
			an1[j++]=szLine1[i]-'0';
		int nLen2=strlen(szLine2);
		j=0;
		for(i=nLen2-1;i>=0;i--)
			an2[j++]=szLine2[i]-'0';
		if(nLen1<nLen2)
		{
			printf("0\n");
			continue;
		}
		nLen1=Substract(an1,an2,nLen1,nLen2);
		if(nLen1<0)
		{
			printf("0\n");
			continue;
		}
		else if(nLen1==0)
			{
				printf("1\n");
				continue;
			}
		aResult[0]++;
		int nTimes=nLen1-nLen2;
		if(nTimes<0)
			goto OutputResult;
		else if(nTimes>0)
		{
			for(i=nLen1-1;i>=0;i--)
			{
				if(i>=nTimes)
					an2[i]=an2[i-nTimes];
				else
					an2[i]=0;
			}
		}
		nLen2=nLen1;
		for(j=0;j<=nTimes;j++)
		{
			int nTmp;
			while((nTmp=Substract(an1,an2+j,nLen1,nLen2-j))>=0)
			{
				nLen1=nTmp;
				aResult[nTimes-j]++;
			}
		}
		OutputResult:
			for(i=0;i<MAX_LEN;i++)
			{
				if(aResult[i]>=10)
				{
					aResult[i+1]+=aResult[i]/10;
					aResult[i]%10;
				}
			}
			bool bStartOutput=false;
			for(i=MAX_LEN;i>=0;i--)
				if(bStartOutput)
					printf("%d",aResult[i]);
				else if(aResult[i])
					{
						printf("%d",aResult[i]);
						bStartOutput=true;
					}
			if(!bStartOutput) printf("0\n");
			printf("\n");
	}
	return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值