高精度乘法

1.高精度乘法概念

由于计算机的存储字节有限,所以不能完整表示一个很大整数的精确值,这时候就得用到其他的方法,称之为高精度算法。这里的高精度乘法主要指按位模拟乘法,实际上就是模拟乘法的过程,也就是笔算的过程。高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。

2.高精度乘法算法的基本流程分析

高精度乘法基本思想和加法一样。其基本流程如下:
①读入被乘数s1,乘数s2
②把s1、s2分成4位一段,转成数值存在数组a,b 中;记下a,b的长度k1,k2;
③i赋为b中的最低位;
④从b中取出第i位与a相乘,累加到另一数组c中;(注意:累加时错开的位数应是多少位?)
⑤i:=i-1;检测i值:小于k2则转⑥,否则转④
⑥打印结果

3.高精度乘法的算法思想:

算法思想
将数字的每个位与下一个要乘的数字进行相乘,然后进行相应的进位处理。

进位处理的过程:先将其中的某一位与数字相乘,如a[0] = 1, 阶乘循环到n = 2,即t = a[0] * 2+data,然后进行判断t是否大于等于10,如果大于等于10,则进行进位处理,即,将本位置为t % 10,然后进位的数字保存在data中。然后下一位处理的时候,t不仅要是本位与数字的乘积还要加上进位。

4.高精度算法的代码实现

代码如下所示:

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

const int N = 1e3 * 3;

char a[N];
int n;

int main() {
	cin >> n;
	memset(a, 'b', sizeof a);
	a[0] = '1';
	int k = 1;
	for (int i = 2; i<=n; i++) {
		int j = 0;
		int data = 0;
		//遍历数字,与下一个数相乘 
		while(j < k) {  
			//计算得出其中一位的乘积  并加上进位 
			int t = (a[j]-'0') * i + data;
			if (t >= 10) {  //如果t >= 10说明需要进位,这里就需要我们,使用data进行保留进位 
				a[j] = t % 10 + '0';
				data = t /10;
			}
			else {
				//表示没有进位,data = 0; 
				a[j] = t % 10 + '0';
				data = 0;
			}
			j++;
		}
		//如果已经乘积完毕,但是仍然有进位(即这里的data大于0) 
		while(data > 0) {
			a[j++] = data%10 + '0';
			data /= 10;
		} 
		k = 0;
		//这里是为了找出乘积后的数字一共有几位数 
		while (a[k++]!='b');
		k--;
	}
	
	//反序输出字符串数组中的字符即是我们的所求数字 
	for (int i = k-1; i>=0; i--) cout << a[i];
	return 0;
}

C++算法的优雅实现:
这是我见过我简洁的实现方法

Wint operator*(const Wint &a,const Wint &b)
{
    Wint n;
    n.assign(a.size()+b.size()-1,0);
    for(int i=0; i!=a.size(); ++i)
        for(int j=0; j!=b.size(); ++j)
            n[i+j]+=a[i]*b[j];
    return n.check();
}
Wint& operator*=(Wint &a,const Wint &b)
{
    return a=a*b;
}

这里有个注意点,就是一定要注意两个方法的实现顺序,不能颠倒。

算法更多的还是对现实的模拟和改进。

如果有帮助,点个关注,相互交流,相互学习,共同进步。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

azuredragonz

相互鼓励,相互帮助,共同进步。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值