作者:Byte_Liu   来源:http://byteliu.com题目:在不使用BigInteger类的情况下,如何计算两个大正整数的和?程序不可能通过一条指令计算出两个大整数的和,但我们可以把一个大运算拆分成多个小运算, 像小学生一样列竖式进行按位运算。这里还有一个问题,我们都知道long类型的取值范围是:

 最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1) 

如果大整数超出了long类型能表示的范围,我们如何存储这样的整数呢?

很容易想到,使用数组存储即可,数组的每一个元素对应大整数的每一个位数。

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

第一步,把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置。之所以倒序存储,更加符合我们从左到右访问数组的习惯。第二步,创建结果数组,结果数组的最大长度是较大整数的位数+1,原因很明显。

第三步,遍历两个数组,从左到右按照对应下标把元素两两相加,就像小学生计算竖式一样。例子中,最先相加的是数组A的第1个元素8和数组B的第1个元素9,结果是7,进位1。把7填充到Result数组的对应下标,进位的1填充到下一个位置:

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

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

第四组相加的是数组A的第4个元素2和数组B的第4个元素3,结果是5,把5填充到Result数组的对应下标:以此类推……一直把数组的所有元素都相加完毕:第四步,把Result数组的全部元素再次逆序,去掉首位的,就是最终结果:

如果给定的大整数最长位数是n,那么创建数组、按位运算、结果逆序的时间复杂度各自都是O(n),整体时间复杂度就是O(n)。

/** * 类描述: 大整数求和 * * @author yugu.lx 2018/10/20 23:02 PM */public class BigNumSum {    public static void main(String args[]) {        char c = '7';        int i = c;        //如何把 char ‘7’ 转为 int 7, 不能直接int i= '7'转化,那样得到是‘7’的Ascii值,即int 55        System.out.println(i);        //可以采用如下方式进行操作把 char ‘7’ 转为 int 7;‘0’的Ascii值是48        int ii = c - '0';        System.out.println(ii);        System.out.println(new BigNumSum().bigNumSum("426709752318", "95481253129"));    }    private String bigNumSum(String bigNum1, String bigNum2) {        char[] num1Chars = new StringBuilder(bigNum1).reverse().toString().toCharArray();        char[] num2Chars = new StringBuilder(bigNum2).reverse().toString().toCharArray();        int[] result = new int[Math.max(num1Chars.length, num1Chars.length) + 1];        for (int i = 0; i < result.length; i++) {            if (i < num1Chars.length) {                result[i] += num1Chars[i] - '0';                carryCover(result, i);            }            if (i < num2Chars.length) {                result[i] += num2Chars[i] - '0';                carryCover(result, i);            }        }        return transferToIntString(result);    }    /**     * 进位操作     *     * @param result     * @param i     */    private void carryCover(int[] result, int i) {        if (i == result.length - 1) {            return;        }        if (result[i] >= 10) {            result[i] -= 10;            result[i + 1] += 1;        }    }    /**     * 把数组转化成字符串     *     * @param array     * @return     */    private String transferToIntString(int[] array) {        StringBuilder sb = new StringBuilder();        for (int i = array.length - 1; i >= 0; i--) {            //如果最高位为0的话则去掉            if (i == array.length - 1 && array[i] == 0) {                continue;            }            sb.append(array[i]);        }        return sb.toString();    }}    
热文推荐

阿里规定超过三张表禁止join,为啥?

哥,厉害,一文讲完了Spring的各种注解...
Java 14 可能带来什么新特性?同时,分享一份Java面试资料给大家,覆盖了算法题目、常见面试题、JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 面试 领取。

u8 和 char如何转化_算法:如何实现大正整数相加?相关推荐

  1. u8 和 char如何转化_如何编写高效率稳定的单片机代码

    猜你喜欢↓↓↓ ?节能小夜灯,用了光敏电阻控制,天黑可自动开灯 ?民间永远都不缺牛人,看看他们发明的机械! ?自制一个逆变器,电气工程师动手能力太强悍! ?几张图让你轻松了解如何利用PCB设计改善散热 ...

  2. 【Java】算法积累1——大整数相加

    算法刚刚入门,每次记录下自己所学的知识总结以及理解,希望能够帮助大家,如有内容有错误或可改进的地方,欢迎一起探讨,一起进步,在此也要感谢WYSCODER学长给我的学习建议 目录 方法一: 思路: 代码 ...

  3. u8 和 char如何转化_EXCEL小知识——如何快速实现文本与数值的互相转化

    我是前言 嗨,大家好,消失了一个多月,我胡汉三,又回来啦~ 今天给大家带来的,是如何实现文本与数值之间的 " 快速 " 转换! 众所周知,在一些制造类公司,公司的运营离不开一些系统 ...

  4. 【基本算法--高精度计算】大整数相加

    [题目描述] 求两个不超过200位的非负整数的和. [输入] 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. [输出] 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是3 ...

  5. Python_机器学习_算法_第1章_K-近邻算法

    Python_机器学习_算法_第1章_K-近邻算法 文章目录 Python_机器学习_算法_第1章_K-近邻算法 K-近邻算法 学习目标 1.1 K-近邻算法简介 学习目标 1 什么是K-近邻算法 1 ...

  6. C++中const char*, string 与char*的转化

    C++中const char*, string 与char*的转化 原文:https://blog.csdn.net/zhang_alongzd/article/details/52790905 版权 ...

  7. 算法偏见是什么_算法可能会使任何人(包括您)有偏见

    算法偏见是什么 在上一篇文章中,我们展示了当数据将情绪从动作中剥离时会发生什么 (In the last article, we showed what happens when data strip ...

  8. 程序框图与计算机程序,_算法与程序框图_ppt.ppt

    <_算法与程序框图_ppt.ppt>由会员分享,可在线阅读,更多相关<_算法与程序框图_ppt.ppt(21页珍藏版)>请在人人文库网上搜索. 1.算法与程序框图,1.1.1 ...

  9. Python_机器学习_算法_第4章_4.决策树算法

    Python_机器学习_算法_第4章_4.决策树算法 文章目录 Python_机器学习_算法_第4章_4.决策树算法 决策树算法 学习目标 4.1 决策树算法简介 学习目标 小结 4.2 决策树分类原 ...

  10. 两个矩阵是否相交的算法_算法血拼:Google+百度+Alibaba+字节+Tencent+网易+360+拼夕夕...

    最热的三伏天来了,相信有许多小伙伴们都已马不停蹄的在准备各大厂的秋招提前批了吧,不知算法与数据结构会不会成为你的坎? 恰好,我这两天花了点时间,整理了些各大厂(Google+百度+Alibaba+字节 ...

最新文章

  1. socket Php 粘包,python3 tcp的粘包现象和解决办法解析
  2. Leet Code OJ 206. Reverse Linked List [Difficulty: Easy]
  3. 普里姆算法(修路问题)+图解
  4. ant design 预览图片_AntD框架的upload组件上传图片时遇到的一些坑
  5. javaweb——新手上路1
  6. WSL : llvm、clang 和XTP
  7. CSS去掉border框的方法
  8. 无版权,全免费,请收藏这10个免费高清无权素材网站
  9. bondprice+matlab,债券久期与凸度的Matlab实现
  10. 分区表中GLO字段对信息收集的影响
  11. css圣杯布局与双飞翼布局_CSS布局研讨会已于2018年更新
  12. 医院计算机人员考试试题,医院信息科考试试题及答案-
  13. HTML5期末作业:明星网站设计与实现——明星薛之谦介绍网页设计7个页面HTML+CSS+JavaScript
  14. TCHAR与char相互转换
  15. 财政支持小微金融服务:角色矛盾与政策改进
  16. SpringBoot集成阿里云OSS上传文件
  17. VMware出现配置文件 .vmx 是由VMware产品创建,但该产品与此版 VMware workstation 不兼容,因此无法使用--VMware版本不兼容问题
  18. JAVA 实现微信公众号的生成带参数二维码和扫码后被动回复消息
  19. 后端中dto、vo、entity的区别
  20. webpack2配置浏览器自动刷新

热门文章

  1. 收藏!Tengine问题排查必备
  2. 樱桃OTC前工程师感恩自白
  3. 【预测模型】基于matlab离散状态空间模型模拟预测控制仿真系统(单输入单输出)【含Matlab源码 1537期】
  4. 【图像隐写】基于matlab DCT数字水印嵌入+检测+攻击(测试鲁棒性)【含Matlab源码 1133期】
  5. python3自动化软件发布系统_PythonPC客户端自动化实现原理(pywinauto)
  6. mysql数据库回滚日志_Mysql数据库慢查询日志的使用
  7. node-red 可视化_可视化与注意-第1部分
  8. java 去掉字符串最后几个字符_java-删除字符串的最后两个字符
  9. varchar长度可以任意设置吗_户内金属软管长度可以超过2m吗?
  10. Android从 HttpResponse (或者InputStream) 获取字符串内容的代码