• [Java]大数运算之加法


    一 题目

    • 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

  • 相关阅读:
    数据结构01-线性表
    java-04流程控制语句
    从0开始的Python学习002python的数据类型
    从0开始的Python学习001快速上手手册
    MySQl ifnull()和substr()
    parent.fraInterface.xxxxxx
    身份证的校验规则
    onclick="return function()"的使用情况
    jsp include 报错:illegal to have multiple occurrences of contentType with different values (old: text/html; charset=UTF-8, new: text/html; carset=UTF-8)
    Oracle数据库忘记用户名密码的解决方案
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/12565740.html
Copyright © 2020-2023  润新知