一 题目

  • 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. python 如何以逗号为分隔符输出数组

    l = [1,2,3,4] print(" ".join(str(i) for i in l)) #输出结果为:1 2 3 4(注意,此时4后面没有空格啦) #以逗号为分隔符 l ...

  2. redis面试题汇总

    1redis持久化机制 redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化,当redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的 2缓 ...

  3. 8css 盒子模型

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. TRACE()宏的使用

    TRACE()宏一般是用在mfc中的,用于将调试信息输出到vs的输出窗口中(这是关键), 这在使用vs作为开发工具的时候,是非常方便的. 然而在开发一般c++程序时,却貌似无法获得这样的便利,其实只要 ...

  5. squad经验总结

    啊美丽卡:M1A2 - TANKM2A3 - BLDL/M2A3M1126 - SCKMATV - RWS(电摇),ZCC(手摇)MATV(TOW) - TOW车M989 - 补给卡/运兵卡 俄军 8 ...

  6. 使用angular/cli新建一个angular项目

    1.打开cmd,进入你代码保存的文件夹,你想把新建的项目保存在哪个文件夹,即进入哪个文件夹: 我把文件放到这里: 然后,使用下面的命令创建项目: // ng new 项目名称,如下示例:创建名为 he ...

  7. JSTl_概述和JSTL_常用便签if

    概念: JavaServer Pages Tag Library JSP 标准标签片*是由 Apache 组织提俱的开源的免费的 jsp 标签 <标签> 作用:用于简化和替换 jsp 页面 ...

  8. 解决VUE中document.documentElement.scrollTop为0(转)

    原文地址:https://blog.csdn.net/WDCCSDN/article/details/82107374 Vue中document.documentElement.scrollTop的值 ...

  9. Leecode 53.最大子数组和(Java 贪心算法、动态规划两种方法)

    想法(没看解析之前想不出来)   -----------------看了解析和答案 1.贪心算法,若当前元素的之前和<0,则丢弃当前元素之前的数列 设一个maxSum作为子序列最大和,一个sum ...

  10. gradle设置

    本地目录: gradle-wrapper.properties distributionUrl=file\:///D:/\.gradle/gradle-7.3-all.zip distribution ...