大数相加

(包含小数的大数相加问题)

求两个超长非负数之和:
  输入为两个非负整数,每个数仅包含0-9的数字、0或1个小数点,长度不大于200
  输出为两数之和。

    //全局变量,判断小数是否向整数进位
    public static boolean isCarry = false;
    
    public static String add(String num1, String num2) {
        //【注】:"."和"|"都是转义字符,必须得加"\"
        String[] number1 = num1.split("\.");
        String[] number2 = num2.split("\.");
        String intDigits1 = number1[0];//num1的整数部分
        String intDigits2 = number2[0];//num2的整数部分
        //num1的小数部分
        String decDigits1 = null;
        if(number1.length > 1)
            decDigits1 = number1[1];
        //num2的小数部分
        String decDigits2 ="";
        if(number2.length > 1)
            decDigits2 = number2[1];
        
        String res = ""; //结果
        //都是整数
        if(decDigits1 == null && decDigits2 == null)
            res = addInt(intDigits1, intDigits2);
        //一个整数一个小数
        else if(decDigits1 != null && decDigits2 == null)
            res = addInt(intDigits1, intDigits2) + "." + decDigits1;
        else if(decDigits1 == null && decDigits2 != null)
            res = addInt(intDigits1, intDigits2) + "." + decDigits2;
        //都是小数
        else if(decDigits1 != null && decDigits2 != null)
            res = addInt(intDigits1, intDigits2) + "." + addDec(decDigits1, decDigits2);
        
        return res;
        
    }


    /**整数相加*/
    public static String addInt(String num1, String num2) {
        char[] ch1 = num1.toCharArray();
        char[] ch2 = num2.toCharArray();
        
        //利用StringBuilder存结果(逐位相加的数字)
        StringBuilder sb = new StringBuilder();
        
        //数字位从低到高相加,相当于char数组中的数字索引从大到小
        int i = ch1.length - 1;
        int j = ch2.length - 1;
        //进位,初始化为0,如果小数到整数有进位,初始化为1 !!!!!
        int c = 0; 
        if(isCarry)
            c++;
        
        while(i >= 0 || j >= 0) {
            int temp = 0;
            if(i < 0)
                temp = ch2[j--] - '0' + c;
            if(j < 0)
                temp = ch1[i--] - '0' + c;
            if(i >= 0 && j >= 0) 
                temp = ch1[i--] - '0' + ch2[j--] - '0' + c;
            
            //产生进位
            if(temp > 9) {
                c = 1;
                temp -= 10;
            }else {
                c = 0;
            }
            
            sb.append(temp);
        }
        //此时存的是倒序结果,要再反转回来
        return sb.reverse().toString();
    }
    
    /**小数相加*/
    public static String addDec(String num1, String num2) {
        char[] ch1 = num1.toCharArray();
        char[] ch2 = num2.toCharArray();
        //较长数组的第i位开始与短数组的第i位相加,其中i为短数组的最大索引, 相加的和还保存给长数组,最后的长数组就是结果
        char[] maxCh = ch1;
        char[] minCh = ch2;
        if(ch1.length < ch2.length) {
            maxCh = ch2;
            minCh = ch1;
        }
        for(int i = minCh.length - 1; i >= 0; i--) {
            maxCh[i] += minCh[i] - '0';
            if(maxCh[i] > 9) {
                if(i > 0) {
                    maxCh[i - 1]++;
                    maxCh[i] = 10;
                }else{
                    //即i==0时,产生小数到整数的进位
                    isCarry = true;
                }
            }
        }
        return new String(maxCh);
    }
    
原文地址:https://www.cnblogs.com/toria/p/11324067.html