现在的位置: 首页 > 综合 > 正文

大数计算_除法

2013年06月22日 ⁄ 综合 ⁄ 共 2527字 ⁄ 字号 评论关闭
/*limit:a>b>0*/
#include<iostream>
using namespace std;
#include<string>

string add(string x,string y)
{
	string sum;
	int index_x=x.size()-1,index_y=y.size()-1;
		int num=0,tmp=0;
	    while(index_x>=0&&index_y>=0){
		    int num_x=x[index_x]-48,
		 	    num_y=y[index_y]-48;
		        num=num_x+num_y+tmp;
		    string temp;
		    if(num>=10)tmp=num/10;
			else tmp=0;
		    temp+=(num%10+48);
		    sum.insert(0,temp);
		    index_x--;index_y--;
	    }
		if(tmp&&index_x<0&&index_y<0){string temp;temp+=(tmp+48);sum.insert(0,temp);}
		else{
	    while(index_x>=0){
		   string temp;
		   int num=x[index_x]-48+tmp;
		   if(num>=10)tmp=num/10;
		   else tmp=0;
		   temp+=(num%10+48);
		   sum.insert(0,temp);
		   index_x--;
	    }
	    while(index_y>=0){
		   string temp;
		   int num=y[index_y]-48+tmp;
		   if(num>=10)tmp=num/10;
		   else tmp=0;
		   temp+=(num%10+48);
		   sum.insert(0,temp);
		   index_y--;
	    }
		if(tmp){string temp;temp+=(tmp+48);sum.insert(0,temp);}
		}
	return sum;
}

string sub(string a,string b)
{
	int len_a=a.size(),len_b=b.size();
	string c;
	int len_c=0;
	bool flag=false;
	while(len_b>0){
		if(flag)a[len_a]=a[--len_a]-1;
		else len_a--;
		char temp=a[len_a]-b[--len_b];
		if(temp<0){temp+=58;flag=true;}
		else {temp+=48;flag=false;}
		c+=temp;
	    len_c++;
	}
	while(len_a>0){
		if(flag)a[len_a]=a[--len_a]-1;
		else len_a--;
		if(a[len_a]<48){a[len_a]+=10;flag=true;}
		else flag=false;
		c+=a[len_a];
		len_c++;
	}
	while(len_c>1&&c[len_c-1]==48)len_c--;
	string sum;
	for(int i=--len_c;i>=0;i--)
		sum+=c[i];
	return sum;
}

string mul(string a,string b)
{
	int len_b=b.size();
	string sum;
	int mark=1;
	while(len_b>0){
		len_b--;
		int len_a=a.size();
		int k=1*mark;
		mark*=10;
		string pre;
		while(len_a>0){
			int temp=(a[--len_a]-48)*(b[len_b]-48);
			string post;
			if(temp/10!=0){post+=temp/10+48;post+=temp%10+48;}
			else post+=temp+48;
			int counter=k;
			k*=10;
			while(counter>1){
				post+='0';
				counter/=10;
			}
			pre=add(pre,post);
		}
		sum=add(sum,pre);
	}
	return sum;
}

string div(string a,string b)
{
	int len_a=a.size(),len_b=b.size();
	int finish=len_b-1;
	string part_a(a,0,finish+1);
	string i="1",s,remain;
	bool first=true;
	while(finish<len_a){                     
		string sum=mul(b,i);
		if(sum==part_a){   //如果整除,part_a要从fihish开始读
			first=false;
			s+=i;
			finish++;
			i="1";
			if(finish<len_a)part_a=a[finish];
			continue;}   
		if(sum.size()>part_a.size()||(sum.size()==part_a.size()&&sum>part_a)){       //如果除数大于被除数,part_a要补上一位
			if(!first)s+=48;
			first=false;
			i="1";
			finish++;
			if(finish<len_a)part_a=part_a+a[finish];
			continue;} 
		while((sum.size()<part_a.size()||(sum.size()==part_a.size()&&sum<part_a))&&i!="9"){          //如果除数小于被除数,那么找出sum的临界值,part_a为余数+补上一位
			i=add(i,"1");
			sum=mul(b,i);
		}
		first=false;
		if((sum.size()==part_a.size()&&sum>part_a)||sum.size()>part_a.size()){    //如果不能整除
			i=sub(i,"1");
			sum=mul(b,i);
		}
		s+=i;
		i="1";
		remain=sub(part_a,sum);
		finish++;
		if(finish<len_a){
			part_a=remain+a[finish];
		}
	}
	return s;
}

void main()
{
	string a,b;
	while(cin>>a>>b)
		cout<<div(a,b)<<endl;
}

抱歉!评论已关闭.