【例1.5】高精除

题目描述

高精除以高精,求它们的商和余数。

代码在此

#include<bits/stdc++.h>

using namespace std;

string int_to_string(int a)

{

	string c="";

	c+=char(a+48);

	return c;

}

int bijiao(string a1,string b1)//a1>b1返回1,a1<b1返回-1,相等返回0 

{

	//cout<<"进入比较\n"; 

	if(a1.length()>b1.length())return 1;

	else if(a1.length()<b1.length())return -1;

	else

	{

		for(int i=0;i<max(a1.length(),b1.length());i++)

		{

			if(b1[i]>a1[i])

			{

				return -1;

				

			}

			if(b1[i]<a1[i])

			{

				return 1;

			}

		}

		return 0;

		//cout<<"完成比较\n";

	}

	

 } 

string jian(string a1,string b1)

{

	//cout<<"进入减法\n"; 

	//1

	string end="";

	int a[300],b[300],c[300],n=0,g=0;//一定是a-b; n代表最长长度 

	bool x=0,out=0;//0正(a大)1负 (b大) 

	x=0;

	if(b1.length()>a1.length())

	{

		x=1;

	}

	else if(b1.length()<a1.length())

	{

		x=0;

	}

	else if(b1.length()==a1.length())

	{

		for(int i=0;i<a1.length();i++)

		{

			if(b1[i]>a1[i])

			{

				x=1;

				break;

			}

			else if(b1[i]<a1[i])

			{

				x=0;

				break;

			}

		}

	}

	//cout<<"减法:完成比较";

	//2

	if(x==0)

	{

		g=0; 

		for(int i=a1.length()-1;i>=0;i--)

		{

			a[g]=a1[i]-48;

			g++;

		}

		g=0;

		for(int i=b1.length()-1;i>=0;i--)

		{

			b[g]=b1[i]-48;

			g++;

		}

		n=a1.length();

	}

	else

	{

		g=0;

		for(int i=b1.length()-1;i>=0;i--)

		{

			a[g]=b1[i]-48;

			g++;

		}

		g=0;

		for(int i=a1.length()-1;i>=0;i--)

		{

			b[g]=a1[i]-48;

			g++;

		}

		g=0;

		n=b1.length();

	}

	//cout<<"减法:完成转换\n";

	for(int i=0;i<n;i++)//减法主体 

	{

		if(a[i]-b[i]<0)

		{

			a[i+1]-=1;

			c[i]=a[i]-b[i]+10;

		}

		else

		{

			c[i]=a[i]-b[i];

		}

	}

	if(x==1)end+='-';

	out=0;

	for(int i=n-1;i>=0;i--)

	{

		if(c[i]!=0)

		{

			out=1;

			break;

		}

	}

	//cout<<"减法:完成运算\n";

	if(out==0)return "0";

	out=0;

	for(int i=n-1;i>=0;i--)

	{

		if(c[i]!=0)out=1;

		if(out==1)end+=char(c[i]+48);

		//cout<<c[i];

	}

	//cout<<end;

	//cout<<a1<<"-"<<b1<<"="<<end<<" x="<<x<<endl;

	return end;

}

string jia(string a1,string b1)

{

	//2

	//cout<<"调用成功"<<a1<<" "<<b1;

	int a[2002],b[2002],c[2002],n=0;// n代表最长长度 

	bool x=0,out=0;//0正(a大)1负 (b大) 

	out=0;

	n=max(a1.length(),b1.length());

	for(int i=0;i<=2001;i++)

	{

		a[i]=0;

		b[i]=0;

		c[i]=0;

	}

	string end="";

	int g=0;

	for(int i=a1.length()-1;i>=0;i--)

	{

		a[g]=a1[i]-48;

		g++;

	}

	g=0;

	for(int i=b1.length()-1;i>=0;i--)

	{

		b[g]=b1[i]-48;

		g++;

	}

	g=0;

	for(int i=0;i<n;i++)//加法主体 

	{

		if(a[i]+b[i]+c[i]>=10)

		{

			c[i]=a[i]+b[i]+c[i]-10;

			c[i+1]+=1;

		}

		else

		{

			c[i]=a[i]+b[i]+c[i];

		}

	}

	if(a[n-1]+b[n-1]>=10)n++;

	for(int i=max(a1.length(),b1.length())+4;i>=0;i--)

	{

		if(c[i]!=0)out=1;

		if(out==1)end+=char(c[i]+48);

	}

	//cout<<end;

	return end;

}

string cheng(string s1,string s2)

{

	int k1=0,k2=0,a[2002],b[2002],c[2002],out=0;

	string myout;

	memset(a,0,sizeof(int)*2002);

	memset(b,0,sizeof(int)*2002);

	memset(c,0,sizeof(int)*2002);

	for(int i=s1.size()-1;i>=0;i--) a[++k1]=s1[i]-'0';

	for(int i=s2.size()-1;i>=0;i--) b[++k2]=s2[i]-'0';

	for(int i=1;i<=k1;i++){

		for(int j=1;j<=k2;j++) c[i+j-1]+=a[i]*b[j];

	}

	for(int i=1;i<=2002;i++) c[i+1]+=c[i]/10,c[i]%=10;

	out=0;

	for(int i=2001;i>=1;i--)

	{

		if(c[i]!=0)out=1;

		if(out==1)myout+=char(c[i]+48);

	}

	return myout;

}

string chu(string a,string b)

{

	int n,g=0,num=0;

	n=b.length();

	string x,s,c,s1,end="";//x存储每次要除法的数字 ,c为商 

	bool out=0;

	//s,s1皆为临时变量 

	if(bijiao(a,b)==-1)return "0";

	x=a.substr(0,b.length()-1);

	for(int i=b.length()-1;i<a.length();i++)

	{

		s="";

		s1="";

		x+=a[i];

		//cout<<x<<endl;

		while(x.length()>0&&x[0]=='0')x=x.substr(1,x.length()-1);

		//cout<<"正在计算"<<x<<endl;

		//cout<<"x:"<<x<<" b:"<<b<<bijiao(x,b)<<endl; 

		if(bijiao(x,b)==-1)

		{

			c+='0';

			g++;

			continue;//是否比除数大

		}

		else//如果比除数大,开始除法 

		{

			for(int g1=9;g1>=0;g1--)//从1开始尝试

			{

				s=int_to_string(g1);

				//cout<<" i:"<<i<<" x:"<<x<<" g1:"<<g1<<" c:"<<c<<"乘法结果(g1*b):"<<cheng(s,b)<<" 被除数-乘法结果:"<<jian(x,cheng(s,b))<<"比较:"<<bijiao(jian(x,cheng(s,b)),b)<<endl;

				if(bijiao(cheng(s,b),x)<=0)//翻译成人话if(x-(i*b)<b)意思为:被除数-尝试的数*除数<除数 因为必须保证除法除完 

				{

					//下一步:没有除完的数字留给下一步做

					//cout<<"i am doing";

					x=jian(x,cheng(s,b));//要除的数-结果

					c+=char(g1+48);//存入商 

					break;

				}

			} 

		 } 	

	}

	out=0;

	if(c[0]=='0')

	{

		while(c.length()>0&&c[0]=='0')c=c.substr(1,c.length()-1);

	}



	return c;//只返回商 

}

string yushu(string a,string b,string c)//求余数,需要商,被除数,除数

{

	return jian(b,cheng(a,c));

 } 

int main()

{

	string a,b,c;

	cin>>a>>b;

	if(a=="0")

	{

		cout<<"0";

		return 0;

	} 

	c=chu(a,b);#include<bits/stdc++.h>
using namespace std;
int a[2002],b[2002],c[2002],n=0;
bool out=0;
void nixu(bool x,string z)
{
	int g=0;
	if(x==0)
	{
		for(int i=z.length()-1;i>=0;i--)
		{
			a[g]=z[i]-48;
			g++;
		}
	}
	else
	{
		for(int i=z.length()-1;i>=0;i--)
		{
			b[g]=z[i]-48;
			g++;
		}
	}
}
string jia(string a1,string b1)
{
	n=max(a1.length(),b1.length());
	for(int i=0;i<=n+2;i++)
	{
		a[i]=0;
		b[i]=0;
	}
	string end="";
	nixu(0,a1);
	nixu(1,b1);
	int g=0;
	for(int i=0;i<n;i++) 
	{
		if(a[i]+b[i]+c[i]>=10)
		{
			c[i]=a[i]+b[i]+c[i]-10;
			c[i+1]+=1;
		}
		else
		{
			c[i]=a[i]+b[i]+c[i];
		}
	}
	if(a[n-1]+b[n-1]>=10)n++;
	for(int i=n-1;i>=0;i--)
	{
		if(c[i]!=0)out=1;
		if(out==1)end+=char(c[i]+48);
		g++;
	}
	return end;
}
int main()
{
	string a,b;
	cin>>a>>b;
	cout<<jia(a,b);
}

	cout<<c<<endl<<yushu(c,a,b);

}

记得给好评!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值