[Java]大数运算之加法
一 题目
- Input:
- String a = "15324564...1455445"; //数字过长,不能转换为int/long型运算
- String b = "45645612...145"; //数字过长,不能转换为int/long型运算
 
- Output:
- x = a + b
 
- 基本思路:
- 当字符串a、b的长度不等时:将二字符串的长度调整到相同
- 即 短的字符串 高位补0 → 以此避免后续 对高位的判断、繁琐处理
 
- 分别转换为字符数组
- 从后向前(右对齐),逐位运算
 
- 当字符串a、b的长度不等时:将二字符串的长度调整到相同
二 源码实现
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]大数运算之加法的更多相关文章
- 收藏的一段关于java大数运算的代码
		收藏的一段关于java大数运算的代码: package study_02.number; import java.math.BigDecimal; import java.math.BigIntege ... 
- java 大数运算[转]
		用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ... 
- JAVA大数运算
		java大数是个好东西,用起来方便,代码短. 代码如下: import java.util.*; import java.math.*; public class Main { public stat ... 
- java大数运算(讲解)
		在算法竞赛或者面试中我们经常遇到大数问题,例如求一个很大的阶层,大数加法等等. 住在这种情况下我们用常规解法(使用long long或long long int)肯定是不行的, 而我们自己用c/c++ ... 
- Java 大数运算
		import java.util.*; import java.math.*; public class Main{ public static void main(String args[]){ S ... 
- java 大数运算,高精度模板
		转自:https://blog.csdn.net/stffer/article/details/46382949 有修改 关于BigInteger类更详细的用法请移步官方文档 package prac ... 
- 大数运算之 Java BigInteger 的基本用法
		大数运算之 Java BigInteger 的基本用法 在程序设计竞赛中会遇到高精度运算的问题,C++没有高精度运算,只能手动模拟人工运算,手动实现高精度,而 java.math 包中的 BigInt ... 
- js,java,浮点数运算错误及应对方法
		js,java浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2 ... 
- java 大数计算
		这几天做了几道用大数的题,发现java来做大数运算十分方便.对acmer来说是十分实用的 1.valueOf(parament); 将参数转换为制定的类型 比如 int a=3; BigInteger ... 
- 大数运算Swift
		前几天开始,打算用Swift写大数的运算,加法跟乘法都已经写好了,写减法发现,真是难,感觉有可能是我的想法不对?不不不我相信我的逻辑. 首先把数字分成小数部分跟整数部分,再遍历一下,识别当前的结果,是 ... 
随机推荐
- C++ 用运算符重载 实现复数相加
			#include "stdafx.h" #include <iostream> using namespace std; class Complex {public: ... 
- 【python】第一模块 步骤四 第一课、初始正则表达式
			第一课.初始正则表达式 一.课程介绍 1.1 课程概要 步骤介绍 正则表达式入门及应用 正则的进阶 案例 综合项目实战 二.正则表达式的基本操作(多敲代码多做练习) 2.1 什么是正则表达式 什么是正 ... 
- input设置自定义属性,并获取值。
			HTML代码: JavaScript代码: 因为busCode不是input标签原生的属性,所以不能使用"点"操作. 非标准属性,要用:obj.getAttribute(" ... 
- 如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法【转载】
			如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法.powermill显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底删除清理干净powermi ... 
- Linux_Tomcat实战
			Tomcat实战 tomcat简述 tomcat安装 部署jspgou项目 tomcat简述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(A ... 
- win10 wampserver升级 php7.0至 php7.2
			1.去官网下载php7.2 下载地址: https://windows.php.net/download#php-7.0 2.下载安装 visual c++ 2017 或 visual c++ 20 ... 
- AcWing 66. 两个链表的第一个公共结点 (2012算法题)
			题目: 输入两个链表,找出它们的第一个公共结点. 当不存在公共节点时,返回空节点. 数据范围 链表长度 [1,2000]. 保证两个链表不完全相同,即两链表的头结点不相同. 样例 给出两个链表如下所 ... 
- greenDao基础用法(一)
			1.配置 1.1 在 build.gradle(project) 中,加入这句 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // a ... 
- ansible介绍与简单的使用
			在roles下建立site.yml文件#site.yml - hosts: webservers remote_user: root roles: - websrvs - dbsrvs#将文件拷贝到f ... 
- C/C++ 数据结构单链表的实现(初始化、插入、删除、销毁)
			#include <iostream> #include <Windows.h> #define MAX_SIZE 100 using namespace std; //单链表 ... 
