大整数除法

思路

1.不断做减法
7546 / 23
开始 商为0, 先减去23的一百倍,也就是2300,发现能减3次,余下645,于是商增加3*100然后用645-23的十倍,能减2次,余下186,商增加20,最后用186-23,能减8次,最后商为328
//减完 从后数起第一个不为0的数是num1的长度

//len1<len2
//len1=len2 num1[len1]<num2[len2]
//其他情况 做减法
//返回新num1的长度

#include<stdio.h>
#include<string.h>
#define MAX_LEN 200
char str1[MAX_LEN+10];
char str2[MAX_LEN+10];
int num1[MAX_LEN+10];
int num2[MAX_LEN+10];
int ans[MAX_LEN+10]; 
//每次除就是做一次减法,看能减被除数的最高倍几次 
//str1.len < str2.len  0
//
int subtract(int *num1,int *num2,int len1,int len2){
	//len1<len2 -1
	if(len1<len2)
		return -1;
	if(len1 == len2){
		//相等长度,比较最高位 
		for(int i=len1-1;i>=0;i--){
			if(num1[i]>num2[i])
				break;
			if(num1[i]<num2[i])
				return -1;
			//num1[i]==num2[i] 找下一位,所以需要循环 
				
		}
	}
	//相减 
	for(int i=0;i<len1;i++){
		num1[i]-=num2[i];
		if(num1[i]<0){
			num1[i]+=10;
			num1[i+1]--;		
		}
	}
	//计算新的长度 
	for(int i=len1-1;i>=0;i--){
		if(num1[i]!=0){
			return i+1;
		}
	}
	return 0;//相等 
}


int main(){
	scanf("%s%s",str1,str2);
	int i,j,len1,len2;
	int di_len; 
	len1 = strlen(str1);
	len2 = strlen(str2);
	
	memset(num1,0,sizeof(num1));
	memset(num2,0,sizeof(num2));
	memset(ans,0,sizeof(ans));
	
	//倒放字符到INT数组 
	j=0;
	for(int i=len1-1;i>=0;i--)
		num1[j++]=str1[i]-'0';
	j=0;
	for(int i=len2-1;i>=0;i--)
		num2[j++]=str2[i]-'0';
	
	di_len = len1 - len2;
	if(di_len<0)
	{
			printf("0\n");
			return 0;
	} 
	//扩充除数
	for(int i=len1-1;i>=0;i--){
		if(i>=di_len)
			num2[i]=num2[i-di_len];
		else
			num2[i]=0;
	}	
	len2=len1;
	//从最高倍,开始做循环
	//0 代表,最高倍数,1代表减少10倍(num2从i 开始) 
	for(int i=0;i<=di_len;i++){
		int count; 
		//开始相减,统计减了几次 
		while((count=subtract(num1,num2+i,len1,len2-i))>=0){
			ans[di_len-i]++;
			len1=count;
		}
	}
		
	//输出结果
	int flag =0;
	for(int i=len2;i>=0;i--){
		if(flag==1)
			printf("%d",ans[i]);
		else if(ans[i]!=0)
		{
			printf("%d",ans[i]);
			flag=1;
		}
	} 
	
	return 0;
} 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值