java中超过long范围的超大整数相加算法详解(面试高频)
作者:大树91 发布时间:2022-09-15 11:22:05
标签:java,long,超大整数,相加
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


猜你喜欢
- @Bean修饰的方法参数的注入方法参数默认注入方式为Autowired,即先根据类型匹配,若有多个在根据名称进行匹配。1:复杂类型可以通过@
- 服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,来避免瞬时的大量请求对系统
- 有个网站需要生成静态页。据以往经验,凡比较烂的空间,短时间内运行耗能大的运算,都会出现“service unavailable”,以致网页无
- 前言:最近准备研究一下图片缓存框架,基于这个想法觉得还是先了解有关图片缓存的基础知识,今天重点学习一下Bitmap、BitmapFactor
- 1.launch启动流程已知协程的启动方式之一是Globalscope.launch,那么Globalscope.launch的流程是怎样的
- 一、实验目的(1)掌握应用黑盒测试技术进行测试用例设计。(2)掌握对测试用例进行优化设计方法。二、实验内容日期问题测试以下程序:该程序有三个
- mport java.text.DecimalFormat; DecimalFormat &nb
- 一,内部类访问成员1,内部类可以直接访问外部类的成员,包括私有。2,外部类要访问内部类,必须建立内部类对象。class Outer{int
- IntelliJ IDEA最佳配置IntelliJ IDEA 分为两个版本:旗舰版(Ultimate)和社区版(Community)。旗舰版
- 本文实例讲述了Android编程实现ListView滚动提示等待框功能。分享给大家供大家参考,具体如下:其实原理很简单,只需要设置监听lis
- 前言众所周知,RxJava2 中当链式调用中抛出异常时,如果没有对应的 Consumer 去处理异常,则这个异常会被抛出到虚拟机中去,And
- 我们来简单实现一个cookie。一、简单介绍Cookie 是一些数据, 存储于你电脑上的文本文件中。当 web 服务器向浏览器发送 web
- 在Spring Boot中,Spring Boot会自动搜索映射的Entity,并且创建相应的table,但是有时候我们希望自定义某些内容,
- 本文实例讲述了Java使用原型模式展现每日生活。分享给大家供大家参考,具体如下:一、模式定义用原型实例指定创建对象的种类,并且通过复制这些原
- 在Android开发中,往往要用到自定义的控件来实现我们的需求或效果。在使用自定义 控件时,难免要用到自定义属性,那怎么使用自定义属性呢?在
- WPF 窗体设置亚克力效果框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可
- 初步的想法是用两个recordset,一个从SQL取数据,一个往Access里面插入数据 因为表的字段比较多,所以只好用一个循环while
- 一.使用场景一次请求需要往数据库插入多条数据时,可以节省大量时间,mysql操作在连接和断开时的开销超过本次操作总开销的40%。二.实现方法
- 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.背景自适应且不失真问题的存在制作自适应背景图
- 当你要做一个图库的项目时,对图片大小、像素的控制是首先需要解决的难题。一、单图生成略缩图单图经过重新绘制,生成新的图片。新图可以按一定比例由