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

戳蓝字“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


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



640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


在程序中列出的 “竖式” 究竟是什么样子呢?我们以 426709752318 + 95481253129 为例,来看看大整数相加的详细步骤:


第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置。之所以倒序存储,更加符合我们从左到右访问数组的习惯。


640?wx_fmt=png



第二步,创建结果数组,结果数组的最大长度是较大整数的位数+1,原因很明显。


640?wx_fmt=png



第三步,遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样。


例子中,最先相加的是数组A的第1个元素8和数组B的第1个元素9,结果是7,进位1。把7填充到Result数组的对应下标,进位的1填充到下一个位置:


640?wx_fmt=png



第二组相加的是数组A的第2个元素1和数组B的第2个元素2,结果是3,再加上刚才的进位1,把4填充到Result数组的对应下标:


640?wx_fmt=png



第三组相加的是数组A的第3个元素3和数组B的第3个元素1,结果是4,把4填充到Result数组的对应下标:


640?wx_fmt=png



第四组相加的是数组A的第4个元素2和数组B的第4个元素3,结果是5,把5填充到Result数组的对应下标:


640?wx_fmt=png



以此类推......一直把数组的所有元素都相加完毕:


640?wx_fmt=png



第四步,把Result数组的全部元素再次逆序,去掉首位的,就是最终结果:


640?wx_fmt=png



640?wx_fmt=jpeg

640?wx_fmt=jpeg


  1. /**

  2. * 大整数求和

  3. * @param bigNumberA  大整数A

  4. * @param bigNumberB  大整数B

  5. */

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

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

  8.    int maxLength = bigNumberA.length() > bigNumberB.length() ? bigNumberA.length() : bigNumberB.length();

  9.    int[] arrayA = new int[maxLength+1];

  10.    for(int i=0; i< bigNumberA.length(); i++){

  11.        arrayA[i] = bigNumberA.charAt(bigNumberA.length()-1-i) - '0';

  12.    }

  13.    int[] arrayB = new int[maxLength+1];

  14.    for(int i=0; i< bigNumberB.length(); i++){

  15.        arrayB[i] = bigNumberB.charAt(bigNumberB.length()-1-i) - '0';

  16.    }

  17.    //2.构建result数组,数组长度等于较大整数位数+1

  18.    int[] result = new int[maxLength+1];

  19.    //3.遍历数组,按位相加

  20.    for(int i=0; i<result.length; i++){

  21.        int temp = result[i];

  22.        temp += arrayA[i];

  23.        temp += arrayB[i];

  24.        //判断是否进位

  25.        if(temp >= 10){

  26.            temp = temp-10;

  27.            result[i+1] = 1;

  28.        }

  29.        result[i] = temp;

  30.    }

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

  32.    StringBuilder sb = new StringBuilder();

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

  34.    boolean findFirst = false;

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

  36.        if(!findFirst){

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

  38.                continue;

  39.            }

  40.            findFirst = true;

  41.        }

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

  43.    }

  44.    return sb.toString();

  45. }


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

  47.    System.out.println(bigNumberSum("426709752318", "95481253129"));

  48. }


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


如何优化呢?


我们之前是把大整数按照每一个十进制数位来拆分,比如较大整数的长度有50位,那么我们需要创建一个51位的数组,数组的每个元素存储其中一位。


640?wx_fmt=png



我们真的有必要把原整数拆分得那么细吗?显然不需要,只需要拆分到可以被直接计算的程度就够了。


int类型的取值范围是 -2147483648——2147483647,最多有10位整数。为了防止溢出,我们可以把大整数的每9位作为数组的一个元素,进行加法运算。(这里也可以使用long类型来拆分,按照int范围拆分仅仅是提供一个思路)


640?wx_fmt=png



如此一来,占用空间和运算次数,都被压缩了9倍。



640?wx_fmt=jpeg



640?wx_fmt=jpeg


1.微信群:

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


2.征稿:

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


推荐阅读

  • Spring事务你可能不知道的事儿

  • 阿里全盘调整组织架构意味着什么?| 畅言

  • 盘点|一文读懂11个主流共识算法, 彻底搞懂PoS,PoW,dPoW,PBFT,dBFT这些究竟是什么鬼

  • 程序员婚恋现状大调查:有人三十岁没谈过恋爱,有人丁克万岁

  • AlphaGo“兄弟”AlphaFold出世,DeepMind再创记录

  • 腾讯将创办腾讯云启商学院,马化腾任荣誉院长

  • 顺应时代需求 浪潮云海OS升级R版本将强势来袭

  • AWS 吹走了私有云天空中最后一片乌云

  • 中国云计算的十年江湖


640?wx_fmt=jpeg

↓↓↓  点击【阅读原文】观看了解更多精彩内容…

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

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

相关文章

BugkuCTF-Crypto题杰斐逊

打开下载文件 这是一类加密方式&#xff0c;叫做轮转密码或者叫比尔密码&#xff0c;解密的方式就是先通过密钥调整字符串的行号&#xff0c;然后通过密文调整一行字符串的顺序&#xff0c;例如&#xff0c;密文的第一个字母是H&#xff0c; 第一行字符串是 则&#xff0c;将…

设置 Visual Studio 字体/背景/行号 - C语言零基础入门教程

目录 一.设置 Visual Studio 颜色主题二.显示 Visual Studio 行号三.设置 Visual Studio 字体大小/风格四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 Visual Studio 默认有三个主题&#xff0c;在我们刚开始安装 Visual Studio 的时候就能看到…

为什么你写了好几页的简历,还是被拒了

戳蓝字“CSDN云计算”关注我们哦&#xff01;前几日&#xff0c;有一个读者把他的简历发给我&#xff0c;叫我帮他看一下。我打开Word文档一看&#xff0c;该说的内容确实也都说了&#xff0c;但就是没说到点子上。就好比明明知道痒在哪里&#xff0c;然而却挠不着。真够急人的…

BugkuCTF-Crypto题小山丘的秘密

本题考查希尔密码 解题流程 题目信息&#xff1a; 1、根据提示知道是希尔&#xff08;hill&#xff09;密码 解密网站&#xff1a;www.atoolbox.net/Tool.php?Id914&accsdn flag.txt 里给出A1&#xff0c;一般的希尔密码是A0&#xff0c;B1, C2 …所以字母表需要修改&a…

BugkuCTF-Crypto题一段Base64

解此题需要下载Converter工具 先Base64解码 再Unescape一下 再16进制ASCII解码一下 再Unescape一下 复制括号里面的参数&#xff0c;再10进制ASCII解码一下 再Html解码一下 再Html解码一下 flag{ctf_tfc201717qwe}

程序员加班很严重吗?看看国外程序员怎么怼老板!

戳蓝字“CSDN云计算”关注我们哦&#xff01;来自&#xff1a;https://blog.csdn.net/weixin_43338842/article/details/84339727作者&#xff1a;前端一鸣 &#xff11;、IT已成为最疯狂的加班行业&#xff0c;没有之一夜幕降临&#xff0c;当IT大楼里依然灯火通明时&#xff…

C语言数组下标越界

数组越界的严重性 在 C 语言里&#xff0c;数组需为静态的。数组的大小需要在程序运行前就确定下来。 C语言数组越界的严重性在于对数组元素访问及修改的内容存在不确定性。 这类没有预知性的修改会导致无法确定的错误&#xff0c;发生缓冲区泄露漏洞。 这也就是数组越界的严重…

重磅!英特尔终于挤出10nm芯片 六大技术战略,震动芯片届

戳蓝字“CSDN云计算”关注我们哦&#xff01;最近几日&#xff0c;对英特尔来说可谓大事连连&#xff0c;在北京&#xff0c;正举办20岁生日的英特尔中国研究院的隔壁楼房着了大火&#xff0c;而远在大洋彼岸&#xff0c;英特尔在加州Los Altos举办的“架构日”上连发大招!北京…

shellcraft新姿势

pwnable_orw exp 脚本 这道题的难度在于只能调用 open read 和 write &#xff0c;学到了 shellcraft 新的使用方式 from pwn import * io remote(‘node3.buuoj.cn’,25539) context.binary ‘orw’ elf ELF(‘orw’) shellcode shellcraft.open(’/flag’) shellcode sh…

C语言 Hello World - C语言零基础入门教程

目录 一.Hello World 源码 1.#include – 预处理器指令2.main 函数 – 入口函数3.printf 函数4.return 0 二.Visual Studio 运行生成项目 1.使用快捷键 Ctrl F52.点击 本地 Windows 调试器 三.猜你喜欢 零基础 Python 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一…

你需要掌握的事件分发高阶知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;系列前作1. Android输入系统的事件传递流程和IMS的诞生2. 只了解View的事件分发是不够的&#xff0c;来看下输入系统对事件的处理1.InputReader的加工类型在只了解View的事件分发是不够的&#xff0c;来看下输入系统对事件的处理这篇…

C语言数据类型 / 变量类型 - C语言零基础入门教程

目录 一.C 语言数据类型分类二.C 语言整形 1.无符号整形&#xff08;16 位系统&#xff09;2.有符号整形&#xff08;16 位系统&#xff09;3.int 和 long 区别4.超出取值范围的整形 三.C 语言浮点型 float/double 1.float&#xff08;单精度&#xff09;2.double&#xff08;…

【拨云见日】全面云化时代,如何选择适合自己的“云”?

戳蓝字“CSDN云计算”关注我们哦&#xff01;随着云计算技术的不断成熟&#xff0c;大数据、人工智能、区块链等技术的推陈出新&#xff0c;政府和企业级客户开始逐渐接受云计算。云计算不仅可以帮助政府客户解决运维人员能力不足、人手不足、安全保障等问题&#xff0c;也可以…

PWN题[强网先锋]orw超详细讲解(多解法)

知识点 构造一段shellcode的作用就是为了在缓冲区溢出时将shellcode的地址覆盖正常的返回地址。 \x00 截断符 shellcode里出现\x00就会从其截断&#xff0c;所以构造shellcode的时候要避免\x00 x64函数调用规则 x64机器在调用某个函数前&#xff0c;比如int func(int a, int…

资深程序员参加面试因穿着被认为是新手,拿下帽子后,被当场录取

戳蓝字“CSDN云计算”关注我们哦&#xff01;&#xff08;图自&#xff1a;微博冰原上空的飞燕&#xff09;IT程序猿 微博网友评论&#xff1a;嘉嘉大美人&#xff1a;这个发型&#xff0c;小公司都雇不起NanoNova&#xff1a;格子衫&#xff0c;脱发这些梗还要用多久贝贝呵呵哈…

BugkuCTF-Crypto题这不是md5

描  述: 666c61677b616537333538376261353662616566357d 知识点&#xff1a;16进制到文本字符串 66 6c 61 67 7b 61 65 37 33 35 38 37 62 61 35 36 62 61 65 66 35 7d 点击十六进制转字符&#xff1a;

为什么公司宁愿花25K重新招人,也不愿花20K留住老员工?

戳蓝字“CSDN云计算”关注我们哦&#xff01;身在职场&#xff0c;经常会暗自打听同事工资&#xff0c;尤其是得知身边新入职同事的工资居然比自己高&#xff0c;还高出一大截时&#xff0c;心里自然很不平衡&#xff0c;一心想要离职。 那么&#xff0c;为什么公司宁愿花高价招…

BugkuCTF-MISC题cisco(writeup)

解题准备 本题需要掌握AES加解密&#xff0c;cisco模拟器软件Cisco Packet Tracer 以及cisco交换机基本命令。 解题流程 cisco 描述: 密码是flag。 把cisco.zip解压后&#xff0c;得到2个txt文档。 解题思路 1.txt打开是乱码&#xff0c;先看看2.txt文件。 2.txt打开后得到…

20张图表达程序员的心酸

戳蓝字“CSDN云计算”关注我们哦&#xff01;「1」被老板委派接手刚刚离职同事的项目...「2」当他们要求我测试所有应用功能时「3」准备下班的时候,测试又提bug过來了… 「4」使用新框架却忘记阅读文档「5」测试实习生的代码「6」网络延迟的危害...「7」测试刚写完的代码「8」d…

BugkuCTF-MISC题convert

下载文件 打开文件&#xff0c;发现1和0总个数除以8余一个数 所以删除尾部的0&#xff0c;将1.txt改为1-删除尾部0.txt 八位二进制 对应 两个十六进制 先将其隔开 with open("1-删除尾部0.txt",r) as f:s f.read()for i in range(0,len(s),8):#print(s[i:i8],end&q…