java中超过long范围的超大整数相加算法详解(面试高频)
作者:大树91 时间:2022-09-15 11:22:05
java里有数字long来表示大的整数,如果两个数字的范围超过了long,要做加法算法怎么做呢?
这个问题在面试中经常碰到,如果之前没有经历的,可能一时有点想不起来怎么做。
下面我们来分析一下,两个数字超过了long的范围,那显然不能用java中的基本数字类型来计算了。
我们可以想小时候刚学习加法的竖式运算,个位对个位,十位对十位,百位对百位、、、以此类推。当个位满十向十位进1,十位满十向百位进1、、、以此类推,就这样完成了运算。
表示出来如下:
1 4 5
+ 2 6 9
-------------
4 1 4
受此启发我们可以做这道题了,数字如果超过了long的范围那显然在java里是以String类型呈现的,下面我们上代码。
package com.wandou.demo.algorithm.post;
import org.junit.Test;
/**
* @author liming
* @date 2020-08-19
* @description 算法
*/
public class BigNumAddDemo {
@Test
public void bigintegerAddTest() {
System.out.println("Long.MAX_VALUE = " + Long.MAX_VALUE);
bigNumAdd("111", "2010");
bigNumAdd(Long.MAX_VALUE + "", Long.MAX_VALUE + "");
bigNumAdd(Long.MAX_VALUE + "", "10");
}
public void bigNumAdd(String strNum1, String strNum2) {
char[] chars1 = strNum1.toCharArray();
char[] chars2 = strNum2.toCharArray();
int len1 = chars1.length;
int len2 = chars2.length;
boolean oneBiger = len1 > len2;
int len = Integer.max(len1, len2);
StringBuilder targetSb = new StringBuilder();
//进位
int carry = 0;
for (int i = 0; i < len; i++) {
int temp;
int idx1 = len1 - 1 - i;
int idx2 = len2 - 1 - i;
if (oneBiger) {
if (i < len2) {
temp = Integer.parseInt(chars1[idx1] + "") + Integer.parseInt(chars2[idx2] + "") + carry;
} else {
temp = Integer.parseInt(chars1[idx1] + "") + carry;
}
} else {
if (i < len1) {
temp = Integer.parseInt(chars1[idx1] + "") + Integer.parseInt(chars2[idx2] + "") + carry;
} else {
temp = Integer.parseInt(chars2[idx2] + "") + carry;
}
}
carry = 0;
if (temp > 9) {
carry = 1;
targetSb.append(temp - 10);
} else {
targetSb.append(temp);
}
}
System.out.println(targetSb.reverse().toString());
}
}
测试结果:
来源:https://blog.csdn.net/wandou9527/article/details/108025167
标签:java,long,超大整数,相加
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java设计模式之工厂模式案例详解
2023-11-27 20:08:03
![](https://img.aspxhome.com/file/2023/2/60342_0s.png)
详解Java Synchronized的实现原理
2023-11-25 06:04:53
![](https://img.aspxhome.com/file/2023/7/60037_0s.png)
Spring Boot调用 Shell 脚本实现看门狗功能
2023-09-14 18:52:07
在Maven下代理服务器设定的方式
2023-10-15 02:17:13
![](https://img.aspxhome.com/file/2023/9/58569_0s.png)
利用Lambda表达式创建新线程案例
2023-08-26 23:16:00
Java实现输出数字三角形实例代码
2023-08-25 02:09:51
![](https://img.aspxhome.com/file/2023/4/58304_0s.png)
Java数据结构超详细分析二叉搜索树
2022-12-01 01:34:20
![](https://img.aspxhome.com/file/2023/3/61023_0s.jpg)
Java中io流解析及代码实例
2023-08-22 16:46:48
![](https://img.aspxhome.com/file/2023/5/58195_0s.jpg)
Java实现图片验证码具体代码
2021-06-30 13:16:35
![](https://img.aspxhome.com/file/2023/9/60989_0s.jpg)
SpringBoot中的Thymeleaf用法
2023-10-30 17:30:39
java HashMap和HashTable的区别详解
2023-08-10 18:41:56
SpringBoot如何在运行时动态添加数据源
2023-11-13 21:36:40
Kotlin中的惰性操作容器Sequence序列使用原理详解
2023-10-01 14:21:55
![](https://img.aspxhome.com/file/2023/7/84717_0s.jpg)
Java对象类型的判断详解
2023-07-26 09:55:07
浅谈mybatis中SQL语句给boolean类型赋值问题
2023-01-19 15:15:42
Flutter网络请求的3种简单实现方法
2023-06-21 10:53:22
Java Collections.shuffle()方法案例详解
2023-11-24 15:53:16
Java使用Tess4J实现图像识别方式
2022-10-07 19:24:11
![](https://img.aspxhome.com/file/2023/9/60659_0s.png)
obix协议在java中的配置和使用详解
2023-11-25 20:59:42
![](https://img.aspxhome.com/file/2023/5/60275_0s.jpg)
在Flutter中制作翻转卡片动画的完整实例代码
2023-06-23 23:31:21