一 题目

  • 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. 乘积小于K的子数组

    乘积小于K的子数组 给你一个整数数组 nums 和一个整数 k ,请你返回子数组内所有元素的乘积严格小于 k 的连续子数组的数目. 示例 1: 输入:nums = [10,5,2,6], k = 10 ...

  2. python题mhy

    def save(s): f=open("test.txt","wt") f.write(s["name"]+"\n") ...

  3. pom.xml配置资源过滤

    <build> <!--设置资源过滤--> <resources> <resource> <directory>src/main/java& ...

  4. mac 安装go语言以及配置环境变量

    Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://golang.google.cn/dl/ 其他版本自己根据系统版本下载,这里只介绍mac下载 一 ...

  5. html:表格

    HTML:表格1.表格三标签:(1)<table> 表格(2)<tr>  行(3)<td>  单元格 2.表格的基本语法和结构<table> <t ...

  6. 循环文件夹汇总所有下载发票的Excel文件数据

    Dim a As String, n As Integer, wbs As Workbook ThisWorkbook.Sheets(1).Cells.Clear a = Dir(ThisWorkbo ...

  7. 2020/03/24 HTML基础复习笔记

    2020-03-24 15:49:30 下午好! 这是我开通博客的第二天也是在钉钉上网课的又一天,为了应对考试现在复习到了HTML基础知识,本打算用VS敲想了想还是用了XMind(真的好用!!!)文件 ...

  8. 02 docker的基本用法

    本章内容 1.OCI 2.docker核心组件--Cgroup与runC 3.docker的架构 4.docker的基本操作 5.安装docker环境 6.创建第一个容器 6.docker容器的状态变 ...

  9. 记录一次MySQL主从同步

    主库配置 server-id=1log-bin=mysql-binbinlog_format=ROWbinlog_row_image=minimalbinlog-do-db=yjtb-cloud 解释 ...

  10. wmware桥接模式

    配置思路(桥接模式) 准备一个与PC机同网段且未被占用的IP地址 将虚拟机的网络模式修改为桥接模式(默认为NAT模式) 修改网卡配置文件,配置为准备好的IP地址,并重启网络服务. 配置DNS解析服务器 ...