大数除(正整数整除)

大数除(正整数整除)

My solution:

/*2015.10.31*/

<span style="font-size:14px;">#include<stdio.h>
#include<string.h>
char c1[100],c2[100];
int t1[100],t2[100],result[100];
int  yuchu(int *a,int *b,int n,int m)
{
	int i,j; 
	if(n<m)
	return -1;
	if(n==m)
	for(i=n-1;i>=0;i--)
	{
		if(a[i]<b[i])
         return -1;
        if(a[i]>b[i])
        break;
	}
	 for(i=0;i<n;i++)
	 {
	 	a[i]-=b[i];
	 	if(a[i]<0)
	 	{
	 		a[i]+=10;
	 		a[i+1]--;//向高位借1. 
		 }
	 }
	 for(i=n-1;i>=0;i--)//找出最高位不为0的元素下标 
	 if(a[i])
	 return i+1;//i+1表示处理后的t1数组的有效数组元素个数(没有前缀0) 如:001203300,有效元素个数为7 
	 return i+1;
}
void chu(int cha,int t)
{
	int n,n1,m,j;
	n=t;m=t;
	for(j=0;j<=cha;j++)//这里一定要加=号,t2数组从该地址(下标为cha)起到m下标结束,存放的是原始数值即同输入的除数一样 
	{
		/*由于被除数位数不足,通过j,依次减去t2数组后缀0,从而继续调用yuchu()*/ 
		while((n1=yuchu(t1,t2+j,n,m-j))>=0)/*n,(m-j)记录当前处理的t1,t2数组的元素个数,t2+j,表示除数从第j位开始参与处理*/
		{
			n=n1;
			result[cha-j]++; /*(cha-j)记录的是当前求得的商存放在结果数组(result)中的下标 */ 
		}	               /*每成功减一次,对应的记录商的元素加1*/ 
	}
	j=cha+1;
	while(!result[--j]);/*去除前缀0,如20000/25得到的结果为(cha=3):result[3]=0,result[2]=8,result[1]=0,result[0]=0*/ 
	for(;j>=0;j--)
	printf("%d",result[j]);
	printf("\n");	
}
int main()
{
	int  i,j,l1,l2,cha;
	while(scanf("%s%s",c1,c2)==2)
	{
		memset(t1,0,sizeof(t1));
		memset(t2,0,sizeof(t2));
		memset(result,0,sizeof(result));
		l1=strlen(c1);
		l2=strlen(c2);
		if(l1<l2)
		printf("0\n");
		else
		{
			for(j=0,i=l1-1;i>=0;i--)
			t1[j++]=c1[i]-'0';
			for(j=0,i=l2-1;i>=0;i--)
			t2[j++]=c2[i]-'0';
			cha=l1-l2;/*最后求得商按位存储在result[cha]......result[0]中*/
			if(cha)
			{
				for(i=l1-1;i>=cha;i--)
				t2[i]=t2[i-cha];
				for(;i>=0;i--)
				t2[i]=0;
			}
			chu(cha,l1);	
		 } 	
	}
	return 0;
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值