一 题目

  • Input:

    • String a = "15324564...1455445"; //数字过长,不能转换为int/long型运算
    • String b = "45645612...145"; //数字过长,不能转换为int/long型运算
  • Output:
    • x = a + b
  • 基本思路:
    • 当字符串a、b的长度不等时:将二字符串的长度调整到相同

      • 即 短的字符串 高位补0 → 以此避免后续 对高位的判断、繁琐处理
    • 分别转换为字符数组
    • 从后向前(右对齐),逐位运算

二 源码实现

import java.util.Scanner;

public class BigDecimalAdd {
public static String convertIntArrayToString(int[] intArray) {
StringBuffer stringBuffer = new StringBuffer();
boolean isNotStart = true; //从左至右, 只要一直遇到的是0,则为true
for (int i = 0; i < intArray.length; i++) {
if (isNotStart) {
if (intArray[i] != 0) {
isNotStart = false;
stringBuffer.append(intArray[i]);
}
} else {
stringBuffer.append(intArray[i]);
}
}
return stringBuffer.toString();
} public static String plus(String a, String b) { //大数相加
int maxLength = a.length() > b.length() ? a.length() : b.length();
int minLength = a.length() < b.length() ? a.length() : b.length();
//1将二字符串调整到相同长度 and 2转换为字符串数组
if(maxLength!=minLength){ //长度不相同时 才需要对 短字符串的高位补0
StringBuffer sb = new StringBuffer();
for(int i=0,dif=maxLength-minLength;i<dif;i++){
sb.append("0");
}
if(a.length()!=maxLength){//a是需要补0的字符串 即 左边(高位)补0 (以此避免后续 对高位的判断、繁琐处理)
a = sb.toString() + a;
} else {//b是需要补0的字符串
b = sb.toString() + b;
}
}
char[] numbersA = a.toCharArray();
char[] numbersB = b.toCharArray();
int[] result = new int[maxLength + 1];//默认 各位初始化值为0
int bitOperateResult; //临时保存位运算的结果
//3开始运算: 两数对比各位进行运算
for (int i = 1; i <= maxLength; i++) {
bitOperateResult = result[result.length - i] + Character.getNumericValue(numbersA[numbersA.length - i]) + Character.getNumericValue(numbersB[numbersB.length - i]);
result[result.length - i] = bitOperateResult % 10; //低位留余
result[result.length - i - 1] = result[result.length - i - 1] + bitOperateResult / 10; //高位进
}
return convertIntArrayToString(result);
} public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
System.out.println("a + b = " + plus(a, b));
}
}
12345
100
a + b = 12445

三 延伸问题

1 多个大数相加呢?

2 2个大数的加、减、乘、除、模?

3 除了上述【整数】的运算,那【浮点数】的运算呢?

4 JDK实现: Java的大数运算类 java.math.BigInteger 与 java.math.BigDecimal

[Java]大数运算之加法的更多相关文章

  1. 收藏的一段关于java大数运算的代码

    收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ...

  2. java 大数运算[转]

    用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...

  3. JAVA大数运算

    java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ...

  4. java大数运算(讲解)

    在算法竞赛或者面试中我们经常遇到大数问题,例如求一个很大的阶层,大数加法等等. 住在这种情况下我们用常规解法(使用long long或long long int)肯定是不行的, 而我们自己用c/c++ ...

  5. Java 大数运算

    import java.util.*; import java.math.*; public class Main{ public static void main(String args[]){ S ...

  6. java 大数运算,高精度模板

    转自:https://blog.csdn.net/stffer/article/details/46382949 有修改 关于BigInteger类更详细的用法请移步官方文档 package prac ...

  7. 大数运算之 Java BigInteger 的基本用法

    大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInt ...

  8. js,java,浮点数运算错误及应对方法

    js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ...

  9. java 大数计算

    这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger ...

  10. 大数运算Swift

    前几天开始,打算用Swift写大数的运算,加法跟乘法都已经写好了,写减法发现,真是难,感觉有可能是我的想法不对?不不不我相信我的逻辑. 首先把数字分成小数部分跟整数部分,再遍历一下,识别当前的结果,是 ...

随机推荐

  1. thymeleaf基础学习

    Thymeleaf 1.标准表达式 ${...}:变量表达式 *{...}: 选择表达式 #{...} : 消息表达式 @{...}: 连接表达式 <img th:src="@{url ...

  2. jquery.axios

    概念:通过 HTTP 请求加载远程数据. *注:所有的选项都可以通过$.ajaxSetup()函数来全局设置. 回调函数:要处理$.ajax()得到的数据,则需要使用回调函数.beforeSend.e ...

  3. SelectionSort,选择排序,C++实现

    1 // g++ selection_sort.cc -Wall -O3 -std=c++11 && ./a.exe 2 3 4 #include <iostream> 5 ...

  4. uni-app之返回上⼀个页⾯并传递参数(从页⾯1跳转到页⾯2,然后页⾯2返回页⾯1并且带回参数。 列如新增地址,带回经纬度和地址名称)

    uni-app之返回上⼀个页⾯并传递参数 1 reBack: function() { 2 let pages = getCurrentPages(); 3 if (pages.length > ...

  5. requests模块获取cookie -----class 'requests.cookies.RequestsCookieJar'

    #coding=utf-8 import requests url="http://www.baidu.com" response=requests.get(url) cookie ...

  6. 设计模式 - 单例模式 Singleton Pattern - C#

    单例模式 Singleton Pattern 1.单例模式设计模式属于创建型模式 2.是单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访 ...

  7. CentOS VMWare安装纪要

    一.VMware虚拟机下载与安装 版本:VMware Workstation 16 Pro 二.CentOS下载与安装 版本:CentOS-7-x86_64-DVD-2009.iso 三.CentOS ...

  8. recovery gerrit

    参考wiki :https://wiki.realtek.com/pages/viewpage.action?pageId=81823331 1.修改IP: for example : Gerrit/ ...

  9. break跳出循环

  10. PyTorch中的矩阵乘法

    1. 二维矩阵乘法   , 其中 , , 输出 的维度是.该函数一般只用来计算两个二维矩阵的矩阵乘法,而且不支持broadcast操作. 2. 三维带Batch矩阵乘法  由于神经网络训练一般采用mi ...