漫画:如何实现大整数相乘?(上)

戳蓝字“CSDN云计算”关注我们哦!

前一段时间,小灰发布了一篇有关大整数相加的漫画,没看过的小伙伴可以先看一看:

漫画:如何实现大整数相加?


那么,大整数相乘又是如何实现的呢?


起初,小灰认为只要按照大整数相加的思路稍微做一下变形,就可以轻松实现大整数相乘。但是随着深入的学习,小灰才发现事情并没有那么简单......



640?wx_fmt=jpeg

640?wx_fmt=jpeg



—————  第二天  —————


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg



怎样列出这个乘法竖式呢?以 93281 X 2034 为例,竖式如下:


640?wx_fmt=png



在程序中,我们可以利用int型数组,把两个大整数按位进行存储,再把数组中的元素像小学竖式那样逐个进行计算。


这个乘法竖式的计算过程可以大体分为两步:

1.整数B的每一个数位和整数A所有数位依次相乘,得到中间结果。

2.所有中间结果相加,得到最终结果。


640?wx_fmt=jpeg


  1. /**

  2. * 大整数求乘积

  3. * @param bigNumberA  大整数A

  4. * @param bigNumberB  大整数B

  5. */

  6. public static String multiply(String bigNumberA, String bigNumberB) {

  7.    //1.把两个大整数用数组逆序存储,数组长度等于两整数长度之和

  8.    int lengthA = bigNumberA.length();

  9.    int lengthB = bigNumberB.length();

  10.    int[] arrayA = new int[lengthA];

  11.    for(int i=0; i< lengthA; i++){

  12.        arrayA[i] = bigNumberA.charAt(lengthA-1-i) - '0';

  13.    }

  14.    int[] arrayB = new int[lengthB];

  15.    for(int i=0; i< lengthB; i++){

  16.        arrayB[i] = bigNumberB.charAt(lengthB-1-i) - '0';

  17.    }

  18.    //2.构建result数组,数组长度等于两整数长度之和

  19.    int[] result = new int[lengthA+lengthB];

  20.    //3.嵌套循环,整数B的每一位依次和整数A的所有数位相乘,并把结果累加

  21.    for(int i=0;i<lengthB;i++) {

  22.        for(int j=0;j<lengthA;j++) {

  23.            //整数B的某一位和整数A的某一位相乘

  24.            result[i+j] += arrayB[i]*arrayA[j];

  25.            //如果result某一位大于10,则进位,进位数量是该位除以10的商

  26.            if(result[i+j] >= 10){

  27.                result[i+j+1] += result[i+j]/10;

  28.                result[i+j] = result[i+j]%10;

  29.            }

  30.        }

  31.    }

  32.    //4.把result数组再次逆序并转成String

  33.    StringBuilder sb = new StringBuilder();

  34.    //是否找到大整数的最高有效位

  35.    boolean findFirst = false;

  36.    for (int i = result.length - 1; i >= 0; i--) {

  37.        if(!findFirst){

  38.            if(result[i] == 0){

  39.                continue;

  40.            }

  41.            findFirst = true;

  42.        }

  43.        sb.append(result[i]);

  44.    }

  45.    return sb.toString();

  46. }

  47. public static void main(String[] args) {

  48.    String x = "3338429042340042304302404";

  49.    String y = "12303231";

  50.    System.out.println(multiply(x, y));

  51. }


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg



————————————



640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg



640?wx_fmt=png



下面,我们的推导会有一些烧脑,请大家坐稳扶好~~


大整数从高位到低位,被平分成了两部分。设整数1的高位部分是A,低位部分是B;整数2的高位部分是C,低位部分是D,那么有如下等式:



640?wx_fmt=png

如果把大整数的长度抽象为n,那么:



640?wx_fmt=png

因此,整数1与整数2 的乘积可以写成下面的形式:



640?wx_fmt=png

如此一来,原本长度为n的大整数的1次乘积,被转化成了长度为n/2的大整数的4次乘积(AC,AD,BC,BD)。



640?wx_fmt=jpeg



640?wx_fmt=png




640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg



什么是master定理呢?


master定理的英语名称是master theorem,它为许多由分治法得到的递推关系式提供了渐进时间复杂度分析。


设常数a >= 1,b > 1,如果一个算法的整体计算规模 T(n) =  a T(n / b) + f(n),那么则有如下规律:


640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg



假设两个长度为n的大整数相乘,整体运算规模是T(n) 。


根据刚才得到的结论,两个大整数相乘被拆分成四个较小的乘积:

640?wx_fmt=png

所以在第一次分治时,T(n)和T(n/2)有如下关系:

T(n) = 4T(n/2) + f(n)

其中f(n)是4个乘积结果相加的运算规模,f(n)的渐进时间复杂度很明显是O(n)


把这个关系带入到master定理的公式 T(n) =  a T(n / b) + f(n) 当中,

此时 a=4, b=2


此时,把a和b的值,以及f(n)的时间复杂度带入到master定理的第一个规律,也就是下面的规律:


640?wx_fmt=png


发现正好符合条件。


怎么符合呢?推导过程如下:


640?wx_fmt=png


所以我们的平均时间复杂度是:

640?wx_fmt=png


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg




—————END—————


1.微信群:

添加小编微信:color_ld,备注“进群+姓名+公司职位”即可,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


2.征稿:

投稿邮箱:liudan@csdn.net;微信号:color_ld。请备注投稿+姓名+公司职位。


推荐阅读

  • 细数华为核心技术家底:华为真会被击垮吗?

  • 如何使用 Lucene 做网站高亮搜索功能?

  • 20张图表达程序员的心酸

  • 一个程序员父亲的呼吁:不要教你的孩子从小学编程!

  • Python | 7招教你识别一个网站是否是Django后台

  • 月薪 50K 大牛整理!6 张 Python 图谱,看完茅塞顿开!


程序人生公众号是CSDN旗下有影响力的开发者自媒体之一。这是一个以程序员日常工作和生活紧密相关且垂直服务于程序员群体的自媒体平台,扫描关注吧~


640?wx_fmt=png

↓点击“阅读原文”,打开APP 阅读更顺畅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ret2dlresolve归纳

ret2dl_resolve的原理&#xff1a; 动态链接相关函数_dl_runtime_resolve(link_map_obj, reloc_index) 功能&#xff1a;在第一次调用某函数时运行&#xff0c;绑定其地址到对应的GOT表项 第一个参数link_map_obj一直为GOT[1]的地址 第二个参数reloc_index为被绑定函数在.rel.…

C语言条件判断 if / else - C语言零基础入门教程

目录 一.C 语言条件判断 if 1.if 语法2.if 实战 二.C 语言条件判断 if / else 1.if / else 语法2.if / else 实战 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 何谓 C 语言条件判断&#xff0c;其实很简单&#xff0c;即**根据条件&#xff…

到底什么是CDN?

戳蓝字“CSDN云计算”关注我们哦&#xff01;如今这个移动互联网时代&#xff0c;越来越多的人使用手机观看视频&#xff0c;丰富自己的娱乐生活。可是&#xff0c;大家在追剧的时候&#xff0c;有没有想过一个问题——为什么有时候明明自己手机的网速很快&#xff0c;但观看视…

BugkuCTF-MISC题MuMuMisc的简单题

查看提示 先看png图片 发现最左侧有些信息 看了大佬们的wp&#xff0c;需要写脚本把左侧这块读出来&#xff0c;黑色对应1&#xff0c;白色对应0&#xff0c;再转成字符 得到的结果base64解码&#xff0c;得到&#xff1a; 回过头看private.key&#xff0c;它其实是个jpg图…

“车联网”最强科普!据说它是未来五年5G兴衰的晴雨表?

戳蓝字“CSDN云计算”关注我们哦&#xff01;说到车联网&#xff0c;相信大家一定不会陌生。现在不管是汽车制造商、销售商&#xff0c;还是阿里腾讯这样的互联网企业&#xff0c;都会经常提到它。简单来说&#xff0c;车联网就是把汽车连起来&#xff0c;组成网络。不过&#…

BugkuCTF-MISC题random color

010打开file&#xff0c;发现文件尾有另一个png图片的数据&#xff0c;提取出来&#xff0c;放到Stegsolve里两张图对比一下&#xff0c;得到一个二维码

C语言逻辑运算符 - C语言零基础入门教程

目录 一.逻辑运算符 1.与运算 &&2.或运算 ||3.非运算 ! 二.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.逻辑运算符 在C 语言 if / else 条件判断中&#xff0c;一个 if 语句的条件判断可以由多个表达式构成,举个例子&#xff1a; …

程序员的晒娃方式

戳蓝字“CSDN云计算”关注我们哦&#xff01;&#xff08;图自&#xff1a;可乐柠檬的日常&#xff09;微博网友评论&#xff1a;挨踢南&#xff1a;性别那叫gender不是sexWTF王启旻ITF&#xff1a;babySay(Hello World!!!);lovelydong&#xff1a;c语言结构体么忘了渔阳2020&a…

BugkuCTF-MISC题split

Kali打开图片&#xff0c;显示 Binwalk和foremost分离不出有效文件 通过TwakPNG打开 显示文件第33个字节有问题&#xff0c;这可能暗示文件末尾的分水岭 Tweakpng打开说第33个字节开始报错&#xff0c;010打开发现从34字节开始的文本描述是(38 39 61)89a&#xff0c;第一反…

C语言三目运算符 - C语言零基础入门教程

目录 一.C 语言三目运算符简介二.C 语言三目运算符实战 1.使用三目运算符2.使用 if / else 条件判断 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.C 语言三目运算符简介 三目运算符&#xff0c;又称条件运算符&#xff0c;是计算机语言&…

BugkuCTF-MISC题telnet

wireshark打开networking.pcap 点击右键->TCP stream&#xff0c;弹出flag

10 张令人喷饭的程序员漫画

戳蓝字“CSDN云计算”关注我们哦&#xff01;0、修电脑的专家是如何炼成的1、维护遗留代码的感觉2、努力把自己升级吧3、这代码谁写的&#xff1f;4、程序员逛酒吧5、程序员的生活写照6、我再也不在课堂上扔纸飞机了一个小朋友在课堂上玩纸飞机&#xff0c;被老师发现后罚写 50…

BugkuCTF-MISC题where is flag

下载附件 解压得到10个txt文件 010打开发现里面全是00截断符号 这时候唯一的线索就是字节大小&#xff0c;用py脚本把各个文件的字节长度跑出来 for n in range(1,11):name str(n).txtwith open(name) as f:print(len(f.read()),end"")跑出来的字节长度应该是十进…

大型私有云运维实践

戳蓝字“CSDN云计算”关注我们哦&#xff01;大家下午好&#xff01;我要分享的题目是国家级私有云的实践。分享的内容有三部分&#xff1a;第一部分为什么要建设云&#xff1f;云建设的目标是什么&#xff1f;第二部分介绍一些云技术发展的趋势&#xff0c;有些技术也好几年了…

C语言自加自减运算符(++i / i++) - C语言零基础入门教程

目录 一.C 语言自加 / 自减 – 运算符简介 1.前 后 的区别2.前–后-- 的区别 二.C 语言自加/自减–运算符实战三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 除了前面文章讲解的逻辑运算符 / 三目运算符 / 逗号表达式&#xff0c;C 语言中自…

BugkuCTF-MISC题where is flag2

开始想着是crc32碰撞&#xff0c;拿到文本里的内容&#xff0c;后面发现txt里的内容都是无意义的 这些txt的文件名很容易让人联想到十六进制&#xff0c;内容无意义应该是为了凑crc32值 把这些txt的crc32值连在一起&#xff0c;转字符得到flag&#xff1a; bugku{You_can’t_…

漫画:为什么互联网人收入高,却这么低调

戳蓝字“CSDN云计算”关注我们哦&#xff01;我们第一IT圈一直流传着各种传说。比如哪个公司应届毕业生收入逼近中产&#xff0c;某某游戏团队年终奖分了多少&#xff0c;某某公司上市又造就了多少位千万富豪。虽然从来没有哪个人真正站出来验证这些传说&#xff0c;但各种人才…

(作者:无名`)svn提交代码到本地仓库

1.创建空文件夹demo1&#xff0c;然后按下图 2.然后 3.demo1中创空文件夹test 4.打开自己的项目&#xff0c;按下图 5.复制刚才第二步路径&#xff0c;加上test&#xff0c;路径变为 file:\\\C:\demo1\test 放入上图url中 打完收工&#xff01;

C语言 for 循环 - C语言零基础入门教程

目录 一.for 循环简介 1.for 循环语法简介2.for 循环代码执行步骤3.for 循环适用场景4.for 循环嵌套 二.for 循环实战 1.简单的 for 循环实现累计求和&#xff1a;1234….102.for 循环嵌套&#xff1a;九九乘法表 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >>…

BugkuCTF-MISC题where is flag3

WinRAR打开压缩包 思路应该和前面两题差不多&#xff0c;前面已经用过了文件大小和crc32 这里考虑一下从修改时间下手&#xff0c;直接看日期没有什么规律&#xff0c;考虑转换成时间戳 用在线网站转换成时间戳&#xff0c;需要精确到秒&#xff0c;这里只能到分&#xff0c;所…