记一道算法题目(大整型数相减)
一、问题
两个大整型数a和b,且a大于b,通过程序实现a-b的结果,输入和输出均使用字符串表示。
二、实现思路
1.将两个大整型数存储在长度相同的数组中,小的数如果没有对应位,用0补全。
2.从最低位开始逐位相减。
3.输出结果(注意0开头的无效数字)
三、java实现
public class Test { private static ThreadLocal<String> user = new ThreadLocal<String>(); public static void main(String[] args) { // user.set("hello world!"); // System.out.println(user.get()); String a = "848751910974194795641067106167401"; String b = "817510571471174141974374347174199"; System.out.println(getDiff(a, b)); } private static String getDiff(String a, String b) { if (a.startsWith("0") || b.startsWith("0")) { throw new ArithmeticException("输入的大数字不能以0开头!"); } //补全处理(小的数字补全 方便计算) if (a.length() >= b.length()) { StringBuilder sb = new StringBuilder(); for (int k = 0; k < (a.length() - b.length()); k++) { sb.append("0"); } b = sb.toString() + b; } else { throw new ArithmeticException("b的位数不能比a大!"); } char[] bigChars = a.toCharArray(); char[] smallChars = b.toCharArray(); int[] big = new int[bigChars.length]; int[] small = new int[bigChars.length]; for (int i = bigChars.length - 1; i >= 0; i--) { //大数赋值 big[bigChars.length - 1 - i] = Integer.valueOf(String.valueOf(bigChars[i])); //小数赋值 small[bigChars.length - 1 - i] = Integer.valueOf(String.valueOf(smallChars[i])); } if (small[big.length - 1] > big[big.length - 1]) { throw new ArithmeticException("b不能比a大!"); } //进行减法计算 int[] result = new int[big.length]; boolean carry = false; for (int j = 0; j < big.length; j++) { int bigNum = big[j]; int smallNum = small[j]; if (carry) { //本位被借位过 if (bigNum == 0) { bigNum = 9; } else { bigNum = bigNum - 1; carry = false; } } if (bigNum >= smallNum) { result[j] = bigNum - smallNum; } else { result[j] = bigNum + 10 - smallNum; carry = true; } } //返回结果组装 StringBuilder resultSb = new StringBuilder(); for (int m = result.length - 1; m >= 0; m--) { resultSb.append(result[m]); } String diff = resultSb.toString(); if (!diff.startsWith("0")) { return diff; } //去掉结果头部的数字0 return removeHeadZero(diff); } private static String removeHeadZero(String diff) { if (diff.startsWith("0")) { diff = diff.substring(1); return removeHeadZero(diff); } else { return diff; } } }