您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

算法:如何实现大正整数相加?

时间:2019-10-25 16:57:04  来源:  作者:
作者:Byte_Liu 
来源:http://byteliu.com/categories/

题目:在不使用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();
 }
}


Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Tags: 算法  点击:(1)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  Tags: 算法  点击:(7)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 算法  点击:(16)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  Tags: 算法  点击:(24)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  Tags: 算法  点击:(32)  评论:(0)  加入收藏
随着注册制的加速推进,新股越来越多,截止到今天A股上市公司的总数高达4500余家,A股一直就是重融资,轻投资的市场,而上市公司发行可转债这种再融资的(圈钱方式)是最能让普通投资者接...【详细内容】
2021-11-05  Tags: 算法  点击:(98)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  Tags: 算法  点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  Tags: 算法  点击:(36)  评论:(0)  加入收藏
每个人都有过这样的经历:打开手机准备回消息或打电话,一看到微信图标右上方的小红点,于是忍不住先打开微信;看完微信,不知不觉又被另一个App牵引,直到关闭手机屏幕才发现自己早已...【详细内容】
2021-11-03  Tags: 算法  点击:(30)  评论:(0)  加入收藏
文丨互联网怪盗团在互联网行业,尤其是在投资人心目中,往往存在一种“算法迷信”或曰“技术迷信”:某公司的广告变现做得好,一定是因为有算法;某公司的云计算业务开展的好,也是因为...【详细内容】
2021-11-03  Tags: 算法  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条