C++ 高精度乘法

163 阅读2分钟

刷题OJ 网站!验证你的代码是否正确!!!

已知高精度加减法的,再看乘除会简单好多。那我们先看下乘法,乘法规则,是两数逐个相乘后再进行加法得出最终结果,其实就是再高精度加法前面做一个乘法操作。

一、高精度的乘法

思想:

  1. 把大数存到字符串;
  2. 对两数想乘的长度求解。
  3. 两数相乘最大的值长度不会超过两个数长度之和。 len_max = len1+len2-1;
  4. 字符串的每个字符数字都通过ASCII转换存到数组。
  5. 注意的是要低位存在数组开头:a[i] = s[len-i-1]-‘0’;
  6. 乘法进位的算式: c[i+j] += a[i] * b[j]
  7. 对数组c进行加法进位: c[i+1] += c[i]/10; c[i] %= 10;
  8. 结果溢出
  9. 反向输出结果;

代码

#include<iostream>
#include<string>
using namespace std;
string s1,s2;
int a[100],b[100],c[200];
int main(){
	cin>>s1>>s2;
	int len1 = s1.size(); 
	int len2 = s2.size(); 
	int len_max = len1+len2-1; //
	for(int i=0;i<len1;i++){  
		a[i] = s1[len1-i-1]-'0'; 
	} 
	for(int i=0;i<len2;i++){  
		b[i] = s2[len2-i-1]-'0';
	}
// 乘法
	for(int i=0;i<len1;i++){
		for(int j=0;j<len2;j++){
			c[i+j] += a[i] * b[j]; 
		}
	}
	for(int i=0;i<len_max;i++){
		c[i+1] += c[i]/10;
		c[i] %= 10;
	}
//溢出处理,再加法进位一次
	while(c[len_max]){
		c[len_max+1] = c[len_max]/10;
		c[len_max] %= 10;
		len_max++;
	} 
//反向输出
	for(int i=len_max-1;i>=0;i--){
		cout<<c[i];
	} 

总长度怎么求的呢? 1.乘法两数相乘(不考虑0),一般总长度是 **【两数长度之和-1,两数长度之和】**这个区间,我这里设置 len_max = len1+len2-1; 竖式乘法求和

image.png

这样看,a数组的下标用i表示,b数组的下标用j表示,那c数组,

可以看出 c[1+0] = a[1]*b[0] + a[0]*b[1] ; 推导出: c[i+j] += a[i] * b[j]

// 乘法

	for(int i=0;i<len1;i++){
		for(int j=0;j<len2;j++){
			c[i+j] += a[i] * b[j]; 
		}
	}

乘完后,c数组的值有超过9的要进行加法进位

	for(int i=0;i<len_max;i++){
		c[i+1] += c[i]/10;
		c[i] %= 10;
	}

进位完成后,接着看有无溢出,最后反向输出结果。