大数除法、取模(模拟的过程,效率低)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/82285237
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
const int N=100010;
void bigdiv(char *diva,char *divb,char *result)//大数除法函数。
{        
	int i,j,k;
	char result_tmp[N];
	char final[N];	
	k=0;
	int lena=strlen(diva);
	int lenb=strlen(divb);
	while(1){                        //死循环只有当lena和lenb相等时跳出循环,因为会不断的在divb数组前加0所以该数组的长度,	     								
		result_tmp[k]=0;//会不断的变化当两者相等时说明已经无法在作减法。
		while(strcmp(diva,divb)>=0){ //用字符串比较的方法是一个亮点,很巧妙。因为strcmp()比较的方式是从前到后依次比较 
			int i=0,j;                  //如果相等则向后移动一位一旦发现不等则立即返回忽略后面的所有数据。
			while(1)
				if(diva[i]=='0') 
					i++;//去除diva高位前面的0
				else{
					j=i;              //去除divb高位填充的0
					break;  
				}
			for(;i<lenb;i++)            //作减法
				diva[i]=diva[i]-divb[i]+'0';
			for(i=lenb-1; i>j; i--)       //每作一组减法就整理数组,这种整理数组在前几篇中都有使用。
				if(diva[i]<'0'){              //不过在这里不是整理结果数组而是diva数组,结果保存在a数组中不用整理
					diva[i]+=10;;
					diva[i-1]--;
				}
			result_tmp[k]++;
		}
		k++;
		if(lena==lenb)   
			break;
		for(i=lenb-1; i>=0; i--)   //将divb中的元素先后移位,同时扩大divb长度并且在divb前端补一位0。
			divb[i+1]=divb[i];
		divb[0]='0';               //由于数组后移所以divb[0]每次移动后都为空,所以每次用0补齐。
		lenb++;
		divb[lenb]='\0';           //在结尾加上字符串的结束标记。
	}
	i=0;j=0;
	while(result_tmp[i]==0) 
		i++;
	for(;i<k;i++)
		final[j++]=result_tmp[i]+'0';
	final[j]='\0';
	strcpy(result,final);
}
using namespace std;
int main()
{
	char a[N],b[N];
	char sum[N];
	scanf("%s%s",a,b);
	int lena=strlen(a);
	int lenb=strlen(b);
	if(lena<lenb||(lena==lenb&&strcmp(a,b)<0))
		printf("0\n%s\n",a);
	else
	{
		bigdiv(a,b,sum);
		puts(sum);
		char mm[N];
		if(a[0]=='0')
		{
			int flag=0,k=0,t;
			for(int i=0;i<strlen(a);i++)
			{
				if(a[i]=='0'&&flag==0)
				{
					t++;
					continue;
				}				
				flag=1;
				mm[k++]=a[i];
			}
			if(t==strlen(a))
				strcpy(mm,"0");
			else			
				mm[k]='\0';	
			puts(mm);
		}
		else
			puts(a);
	}	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/82285237