每周一算法:高精度乘法(二)大整数乘大整数

这篇具有很好参考价值的文章主要介绍了每周一算法:高精度乘法(二)大整数乘大整数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

高精度乘法

高精度乘法是采用模拟算法对上百位甚至更多位的数字进行乘法运算。具体应用时一般分为两类:

  • 大整数数乘整数
  • 大整数乘大整数

算法思想

大整数乘大整数的基本思想是模拟竖式计中算多位数乘多位数,一般分为下面几步:

  • 将乘数 A A A的每一位 A i A_i Ai分别与乘数 B B B的每一位 B j B_j Bj相乘,将结果累加到乘积 C i + j C_{i+j} Ci+j位中
  • 对乘积 C C C中的每一位 C i C_i Ci进行进位处理
  • 最后处理好多余的前导 0 0 0

下面以 123 × 89 123\times89 123×89为例模拟计算过程。

第一步,需要枚举乘数A的每一位 A i A_i Ai与乘数B每一位 B j B_j Bj,分别将它们相乘。

  • A A A的个位 A 0 = 3 A_0=3 A0=3分别与 B B B的每一位 B j B_j Bj相乘,将结果累加到乘积 0 0 0位和 1 1 1位中。
    每周一算法:高精度乘法(二)大整数乘大整数

  • A A A的十位 A 1 = 2 A_1=2 A1=2分别与 B B B的每一位 B j B_j Bj相乘,将结果累加到乘积 C C C的对应位中。注意:此时是十位与 B j B_j Bj相乘,因此在累加乘积时需要向左偏移1位,也就是累加到 C 1 + j C_{1+j} C1+j
    每周一算法:高精度乘法(二)大整数乘大整数

  • A A A的百位 A 2 = 1 A_2=1 A2=1分别与 B B B的每一位 B j B_j Bj相乘,将结果累加到乘积 C C C的对应位中。注意:此时是百位与 B j B_j Bj相乘,因此在累加乘积时需要向左偏移2位,也就是累加到 C 2 + j C_{2+j} C2+j
    每周一算法:高精度乘法(二)大整数乘大整数

接着,将累加得到的乘积的每一位处理好进位,就得到最终的乘积了。
每周一算法:高精度乘法(二)大整数乘大整数
最后,如果乘积的高位有多余的 0 0 0,还需要将这些前导 0 0 0去掉。例如,乘数为0时,最终只需要保留 1 1 1 0 0 0即可。

真题演练

[题目链接]P1303 A*B Problem

题目描述

给出两个非负整数,求它们的乘积。

输入格式

输入共两行,每行一个非负整数。

输出格式

输出一个非负整数表示乘积。

样例输入

1 
2

样例输出

2

提示

每个非负整数不超过 1 0 2000 10^{2000} 102000文章来源地址https://www.toymoban.com/news/detail-413434.html

代码实现

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
vector<int> mul(vector<int> &a, vector<int> &b) {
    vector<int> c(a.size() + b.size(), 0); //初始化乘积c的大小,并默认填入0
    //模拟竖式乘法
    for(int i = 0; i < a.size(); i ++)
        for(int j = 0; j < b.size(); j ++) 
            c[i + j] += a[i] * b[j];
    //处理进位
    for(int i = 0; i < c.size() - 1; i ++)
    {
        c[i + 1] += c[i] / 10;
        c[i] %= 10;
    }
    while(c.size() > 1 && c.back() == 0) c.pop_back(); //去掉前导0
    return c;
}
int main()
{
    string a, b;
    cin >> a >> b;
    vector<int> A, B;
    for(int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0'); 
    for(int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0'); 
    vector<int> C = mul(A, B);
    for(int i = C.size() - 1; i >= 0; i --) cout << C[i];
    return 0;
}

总结

  • 大整数乘大整数,就是计算两个大整数相乘的结果,例如,计算一个大整数的平方等等。
  • 基本思想是将从低到高枚举一个大整数的每一位,与另一个大整数的每一位相乘,将结果累加到乘积的对应位上,然后再处理进位。最后不要忘记处理多余的前导 0 0 0


相关练习

  • NOIP2012 提高组 国王游戏

到了这里,关于每周一算法:高精度乘法(二)大整数乘大整数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 高精度乘法

    高精度加减法讨论的是两个大整数之间的运算。 而这里高精度乘除法讨论的是一个大整数和一个小整数之间的关系。 算法思路: 还是模拟小学的乘法列竖式,只不过此时不太一样,原本的列竖式是一位一位的乘,这里需要改变一下思路。 这里直接把小整数当成一个数,所乘

    2024年02月08日
    浏览(50)
  • 高精度乘法模板(fft)

     正常高精度复杂度是o(n^2),fft复杂度o(nlogn)

    2024年02月10日
    浏览(41)
  • Acwing793. 高精度乘法

    AcWing 793. 高精度乘法 A x b 和 A x B 的模版(大数相加、大数相乘通用模板)

    2024年02月10日
    浏览(35)
  • 高精度加法,减法,乘法,除法(下)(C语言)

    前言 上一篇博客我们分享了高精度加法,减法,这一期我将为大家讲解高精度乘法和高精度除法。那让我们开始吧! 对加法和减法感兴趣的话就点我 让我们想想我们平时做数学时遇见乘法是怎么做的。以下图为例。 高精度乘法也是这样的一个思路,首先我们先把a和b的值储存

    2024年02月04日
    浏览(66)
  • 高精度加法,减法,乘法,除法(上)(C语言)

    前言 本篇内容介绍加法和减法,如果想看乘法和除法就点这里-高精度乘法,除法 加,减,乘,除这些运算我们自然信手捏来,就拿加法来说,我们要用c语言编程算a+b的和,只需让sum = a+b即可,可是这是局限的,我们都知道int的表示的最大值为2147483647(32位和64位机器)。但

    2024年02月03日
    浏览(40)
  • [每周一更]-(第82期):认识自然处理语言(NLP)

    GPT的大火,带起了行业内大模型的爆发;国内外都开始拥有或者研发自己的大模型,下边我们从NLP来进一步深入了解大模型、AI。 一、什么是NLP? 自然语言处理 (英语:Natural Language Processing,缩写作 NLP )是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然

    2024年01月16日
    浏览(42)
  • [每周一更]-(第54期):Go的多版本管理工具

    参考 https://zhuanlan.zhihu.com/p/611253641 https://learnku.com/articles/78326 前文概要 Go语言从开始使用从1.13起步,随着泛型的支持,带领团队在转型Go的时候,做基础组件架构选型使用1.18,但是Go版本不断迭代想使用最新版本来体验下,类比前端中node,有个nvm工具; 联想到Go应该也会有对

    2024年02月16日
    浏览(38)
  • [每周一更]-(第27期):HTTP压测工具之wrk

    [补充完善往期内容] wrk是一款简单的HTTP压测工具,托管在Github上,https://github.com/wg/wrk wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的

    2024年02月03日
    浏览(37)
  • [每周一更]-(第69期):特殊及面试的GIT问题解析

    整合代码使用过程的问题,以及面试遇到的细节,汇总一些常用命令的对比解释和对比; 1、fetch和pull区别 git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。 git pull则是将远程主机的最新内容拉下来后直接合并,即:git pull = git

    2024年02月08日
    浏览(42)
  • [每周一更]-(第45期):Docker私有镜像仓库配置并打通阿里云OSS

    Docker Registry 2 官方镜像创建一个私有镜像仓库,将Docker 镜像上传到 OSS 相应的路径中。 参考: BatchCompute Docker支持:https://help.aliyun.com/document_detail/143334.html?spm=a2c4g.143333.0.0.4a6f8752ls18FR Docker Registry:https://docs.docker.com/registry 基于OSS搭建私有 Docker Registry:https://developer.aliyun.com

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包