大数相乘“高精度乘低精度”和“高精度乘高精度”


前言

由于计算机的存储字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为高精度算法。这里的高精度乘法主要指按位模拟乘法,实际上就是模拟乘法的过程,也就是笔算的过程。


一、高精度乘低精度

高精度乘低精度,即一个大数与一个小于10000的数相乘,大数使用字符串来进行存储,较小的数使用int类型来存储就可以。

代码如下:

#include<bits/stdc++.h>
using namespace std;
//C = A * b;A是大数,b使用int类型存储 
vector<int> mul(vector<int> &A,int b)
{
	vector<int> C;//声明一个动态数组,用于储存结果 
	int t=0;//进位的值,初始值是0,即最开始的进位是0 
	for(int i = 0;i < A.size() || t;i++) 
	//在这里循环进行下去的条件是,i还没有循环结束或者进位值t不等于0 
	{
		if(i<A.size()) t += A[i]*b; //计算出,A的其中1位和b的乘积 
		C.push_back(t%10);//余数就是其中一位的值 
		t /= 10; //这个就是需要进到下一位的值 
	}
	while(C.size()>1&&C.back()==0) C.pop_back();//去除前导0 
	return C;
}

int main()
{
	string a;
	int b;
	cin>>a>>b;
	vector<int> A;
	for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
	//将a存储在int类型的动态数组中,并且翻转,方便后续计算。 
	vector<int> C = mul(A,b);
	for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
	return 0;
}


二、高精度乘高精度

在这里进位的思想和上一个是一样的,其中需要注意有两点,如下:

首先,两个数相乘,这两个结果的最大的位数,是这两个数的位数相加。

其次,我们需要找到结果的每一位与两个相乘的数的对应关系。

C[i + j] += A[i] * B[j];

这一行代码,就是结果和两个相乘的数的对应的关系,先一位位的乘得到结果,最后再来统一处理进位。

代码如下;

#include<bits/stdc++.h>
using namespace std;

vector<int> mul(vector<int> &A,vector<int> &B)
{
	vector<int> C(A.size() + B.size());
	for(int i=0;i<A.size();i++)
	{
		for(int j=0;j<B.size();j++)
		{
			C[i + j] += A[i] * B[j];
		}
	}
	int t=0;
	for(int i=0;i<C.size();i++)
	{
		t+=C[i];
		C[i]=t%10;
		t/=10;
	}
	while(C.size()>1&&C.back()==0) C.pop_back();
	
	return C;
} 

int main()
{
    string a,b;
    cin>>a>>b;
    vector<int> A,B;
    for (int i = a.size() - 1;i >= 0;i--) A.push_back(a[i]-'0');
    for (int i = b.size() - 1;i >= 0;i--) B.push_back(b[i]-'0');
    vector<int> C = mul(A,B);
    for (int i = C.size() - 1;i >= 0;i--) cout<<C[i];
    
    return 0;
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页