【TSOJ课程】18 1136 高精度乘法

这篇博客主要讲解了1136题目的高精度乘法算法。通过对手算过程的模拟,得出乘法结果应放置在对应位置的规律,并通过双层循环实现乘法运算,避免因数字过大导致的越界问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

课程29_17 1136 高精度乘法


题目:

题目描述:

给出两个长度小于100位的正整数,求其乘积。

输入描述:

两行,一行一个数。

输出描述:

一行,为所求乘积。

样例输入:

1937
2931

样例输出:

5677347


解析:

又是高精度。

其实高精度的加法减法和乘法都大同小异,都是通过模仿手算的方式去实现的。但是乘法的手算如果模拟起来会显得比较麻烦,所以我们要稍微加强一下。

我们唯一需要搞清楚的是,当某两个数字相乘以后,结果跑去了哪?

请看如下简陋图:

在这里插入图片描述

首先我们会先计算a乘上b的最后一个数的结果,我们发现,a2 x b1的结果我们写在了c3的位置,a1 x b1的结果我们写在了c2的位置……。于是我们大胆的猜测,是不是a(m) x b(n)的结果就应该写在c(m+n)的位置呢?

于是我们进一步验证:a2 x b0写在了c2、a0 x b0写在了c0。很明显这个规律应该是对的,那么我们就按照这个去做,把乘法的结果加在对应位置上(比如c2既有a2b0也有a1b1,那么c2=a2b0 + a1b1),然后如果计算过程中出现超过10的数字,就把他进位即可。


解题:

对于两个数字的乘法,我们发现每两个位置之间都必须要相乘一次。比如说上面举的例子中a有3位,b有2位,那么b0和a0~2都乘过,b1也是,一共乘了6次。所以我们只需要写一个双层的for循环就可以完成这个乘法了。

另外我们注意到:规律是c(m+n) += a(m)*b(n),那么m+n的范围就是0到2倍的m、n的范围,但是题目也说了答案不会超过200个数字,所以说明输入的两个不会超过100个数字,所以你会看到在for循环之中,我们的循环终止条件是ib<MAX_DIGIT/2,否则的话,会出现两个i相加大于MAX_DIGIT然后光荣越界的事故。

参考代码:

// TSOJ-1136 高精度乘法 
#include <iostream>
#include <string>
using namespace std;
#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值