高精度运算方法

高精度加法就是一位一位的运算,很简单的道理,但是自己用数组模拟出来的代码非常繁杂,就直接用他的高精度加法模板了,根据这个模板可以写出减法和乘法,只需要改动子程序部分就可以了。减法多一项比较环节,将所有减法全部转换为较大数减去较小数,更方便计算。乘法部分主要的因素在于位与位相乘后所处的权值位置,由第i位乘上第j位得到的数应该在第i+j位上,也就是C【i+j】+=A【i】*B【j】;

高精度加法:

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void add(int A[],int B[],int C[])
{
	for(int i=0;i<=lc-1;i++)
	{
		C[i]+=A[i]+B[i];
		C[i+1]+=C[i]/10;
		C[i]%=10;
	}
	if(C[lc])lc++;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		string a,b;
		cin>>a>>b;
		cout<<"Case "<<i<<":"<<endl;
		cout<<a<<" + "<<b<<" = ";
		int A[N],B[N],C[N];
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		memset(C,0,sizeof(C));
		la=a.size(),lb=b.size();lc=max(la,lb);
		for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
		for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
		add(A,B,C);
		for(int j=lc-1;j>=0;j--)
		{
			cout<<C[j];
		}
		cout<<endl;
		if(i!=n)cout<<endl;
	}
}

高精度减法:

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void Minus(int A[],int B[],int C[])
{
	for(int i=0;i<=lc-1;i++)
	{
		C[i]=C[i]+A[i]-B[i];
		if(C[i]<0)
		{
			C[i]+=10;
			C[i+1]--;
		}
		C[i+1]+=C[i]/10;
		C[i]%=10;
	}
	while(lc-1>0&&!C[lc-1])lc--;
}
int cmp(int A[],int B[])
{
	if(la!=lb)return la>lb;
	for(int i=la-1;i>=0;i--)
	{
		if(A[i]!=B[i])return A[i]>B[i];
	}
	return 1;
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		string a,b;
		cin>>a>>b;
		int A[N],B[N],C[N];
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		memset(C,0,sizeof(C));
		la=a.size(),lb=b.size();
		for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
		for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
		if(!cmp(A,B))
		{
			swap(A,B);
			cout<<"-";
		}
		lc=max(la,lb);
		Minus(A,B,C);
		for(int j=lc-1;j>=0;j--)cout<<C[j];
		cout<<endl;
	}
}

高精度乘法:

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
void Times(int A[],int B[],int C[])
{
	for(int i=0;i<=la-1;i++)
	{
		for(int j=0;j<lb;j++)
		{
			lc=max(lc,i+j);
			C[i+j]=C[i+j]+A[i]*B[j];
			C[i+j+1]+=C[i+j]/10;
			C[i+j]%=10;
		}
	}
	while(C[lc])lc++;
	while(lc-1>0&&!C[lc-1])lc--;
}
int main()
{
	int n;
		string a,b;
		cin>>a>>b;
		int A[N],B[N],C[N];
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		memset(C,0,sizeof(C));
		la=a.size(),lb=b.size();
		for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
		for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
		lc=max(la,lb);
		Times(A,B,C);
		for(int j=lc-1;j>=0;j--)cout<<C[j];
		cout<<endl;
}

高精度除法有两种情况,一种是高精度除以低精度,一种是高精度除以高精度,而高精度除以高精度的方法也同样可以解决高精度除以低精度,所以就直接用高精度除以高精度的方法去完成就行了,复杂度等同于高精度除以低精度,为O(n)。

#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int la,lb,lc;
int cmp(int A[],int B[])
{
	if(A[lb]>0)return 1;
	for(int i=lb-1;i>=0;i--)
	{
		if(A[i]!=B[i])return A[i]>B[i];
	}
	return 1;
}
void div(int A[],int B[],int C[])
{
	
	for(int i=la-lb;i>=0;i--)
	{
		while(cmp(A+i,B))
		{
			for(int j=0;j<=lb-1;j++)
			{
				if(A[i+j]<B[j])
				{
					A[i+j+1]--;
					A[i+j]+=10;
				}
				A[i+j]-=B[j];
			}
			C[i]++;
		}
	}
	while(lc-1>0&&!C[lc-1])lc--;
}
int cmp1(int A[],int B[])
{
	if(la!=lb)return la>lb;
	for(int i=la;i>=0;i--)
	{
		if(A[i]!=B[i])return A[i]>B[i];
	}
	return 1;
} 
int main()
{
	int n;
		string a,b;
		cin>>a>>b;
		int A[N],B[N],C[N];
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		memset(C,0,sizeof(C));
		la=a.size(),lb=b.size();
		for(int j=0;j<la;j++)A[j]=a[la-j-1]-'0';
		for(int j=0;j<lb;j++)B[j]=b[lb-j-1]-'0';
		lc=la; 
		if(!cmp1(A,B))
		{
			cout<<0<<endl;
			for(int i=la-1;i>=0;i--)cout<<A[i];
			cout<<endl;
			return 0;
		}
		div(A,B,C);
		for(int j=lc-1;j>=0;j--)cout<<C[j];
		cout<<endl;
		while(la-1>0&&!A[la-1])la--;
		for(int j=la-1;j>=0;j--)cout<<A[j];
		cout<<endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值