算法系列:高精度乘法

大家好,我是屁孩君,最近有位好友回归了,我十分高兴,这样的话就不是我一个人内卷了,而是一起内卷了!!!
在这里插入图片描述
话不多说,直接进入正题。
在这里插入图片描述
因为我们高精度乘法是需要错位相加的,但也是有规律的,得数下标等于两个乘数下标之和,例如数组b的5去逐位乘数组a时,5*5进二余5,那5就存在c数组的第0(0+0)个元素里,那我们就能用两个for循环来遍历,一个遍历数组a,一个遍历数组b,c用来存储相乘的积。
屁孩君再来给大家写一下思路
1:将两个字符串逆序存入数组a与数组b

	for(i=0;i<s1.size();i++)
	{
		a[i]=s1[s1.size()-i-1]-'0';
	}
	for(i=0;i<s2.size();i++)
	{
		b[i]=s2[s2.size()-i-1]-'0';
	}

2:用a[i]去乘以b[j]

这个大家都会吧!

3:错位加到c数组里

	c[i+j]=c[i+j]+a[i]*b[j];

4:从数组的最后面往前面遍历,找到第一个非零元素,简单的来讲就是第一个有数的位置

for(i=s1.size()+s2.size()-1;i>=0;i--)
	{
		if(c[i]!=0){
			p=i;
			break;
		}
	}

5:逆序输出

这个大家也会吧!

话不多说,直接上完整代码

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[500],i,j;
int main()
{ 
	int p;
	cin>>s1>>s2;
	for(i=0;i<s1.size();i++)
	{
		a[i]=s1[s1.size()-i-1]-'0';
	}
	for(i=0;i<s2.size();i++)
	{
		b[i]=s2[s2.size()-i-1]-'0';
	}
	for(i=0;i<s1.size();i++)
	{
		for(j=0;j<s2.size();j++)
		{
			c[i+j]=c[i+j]+a[i]*b[j];
			if(c[i+j]>=10)
			{
				c[i+j+1]+=c[i+j]/10;
				c[i+j]%=10;
			}
		}
		
	}
	for(i=s1.size()+s2.size()-1;i>=0;i--)
	{
		if(c[i]!=0){
			p=i;
			break;
		}
	}
	for(i=p;i>=0;i--)
	{
		cout<<c[i];
	}
	return 0;
} 

今天就给大家分享到这里了。
古德拜!!!
记得一键三连哦!!!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值