(包含小数的大数相加问题)
求两个超长非负数之和:
输入为两个非负整数,每个数仅包含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); }