[高精度乘法]【蓝桥 算法提高 高精度乘法】模拟乘法 图解 例题

[高精度乘法]【蓝桥 算法提高 高精度乘法】模拟乘法 图解 例题

【蓝桥】例题

http://lx.lanqiao.cn/problem.page?gpid=T311
高精度乘法
http://lx.lanqiao.cn/problem.page?gpid=T70
高精度加法

一、为什么要高精度?

题目要求乘法加法的数值过大,超出范围,不能正常计算,因此需要把数字存在数组,每一个元素当成数字的每一位,模拟计算的过程。

二、高精度乘法图解及分析

1.把数字塞进数组后竖式乘法就可以发现 规律 C[i+j] = a[i]+c[i]

2.但我们会发现数字相乘会存在进位,所以我们得反着存,所以在数组中是这样的

在这里插入图片描述

3 由于前面是反着存的所以输出需要从后往前输出

三 具体实现步骤

1 将数据存进字符串中

2 将字符串反转并存在数组里

	string a1;
	string b1;
	int a[10000],b[10000];
	cin>>a1,cin>>b1;
	for(int i = a1.length()-1,k=0;i>=0;i--){
		a[i] = a1[k++]-'0';
	}
	for(int i = b1.length()-1,k=0;i>=0;i--){
		b[i] = b1[k++]-'0';
	}  

3 模拟乘法(注意进位问题)

for(int i = 0;i<a1.length();i++){
    	for(int j = 0;j<b1.length();j++){
			A[i+j] += a[i]*b[j];
			A[i+j+1] += A[i+j]/10;
			A[i+j]%=10;
		}
	}

4 删除前导0,并且反向输出

int len = a1.length()+b1.length();
	while(A[len]==0&&len>0) len--;
	for(int i = len;i>=0;i--){
		cout<<A[i];
	}

四 完整代码

#include<bits/stdc++.h>
using namespace std;
int A[100000001]={0}; // 答案
int main(){
	string a1;
	string b1;
	int a[10000],b[10000];
	cin>>a1,cin>>b1;
	for(int i = a1.length()-1,k=0;i>=0;i--){
		a[i] = a1[k++]-'0';
	}
	for(int i = b1.length()-1,k=0;i>=0;i--){
		b[i] = b1[k++]-'0';
	}    // 反转存储
//	cout<<a[0]<<" "<<a[1];
	
    for(int i = 0;i<a1.length();i++){
    	for(int j = 0;j<b1.length();j++){
			A[i+j] += a[i]*b[j];
			A[i+j+1] += A[i+j]/10;
			A[i+j]%=10;
		}
	}
	int len = a1.length()+b1.length();
	while(A[len]==0&&len>0) len--;
	for(int i = len;i>=0;i--){
		cout<<A[i];
	}
	return 0;
}

附加 高精度加法

总体而言差不多 区别在于模拟加法和位数控制不一样

#include<bits/stdc++.h>
using namespace std;
int ans[1000000]={0};
int main(){
	string a1,b1;
	cin>>a1>>b1;
	int a[10000],b[10000];
	for(int i = a1.length()-1,k=0;i>=0;i--){
		a[i] = a1[k++]-'0';
	}
	for(int i = b1.length()-1,k=0;i>=0;i--){
		b[i] = b1[k++]-'0';
	}    // 反转存储
	for(int i = 0;i<a1.length()||i<b1.length();i++){
		ans[i] += a[i]+b[i];
		ans[i+1]+=ans[i]/10;
		ans[i] %=10;
	//	cout<<ans[i]<<endl;
	}
	int len = max(a1.length(),b1.length())+1;
	while(ans[len]==0)len--;
	for(int i = len;i>=0;i--){
		cout<<ans[i];
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值