以大数相乘为例,思考怎样写出一个健壮的程序
思路就是采用模拟手乘的方法,没有难度,本文重点不在于怎么写出大数相乘的算法。
我是想通过写这么一个方法,告诉自己写程序时要保证程序的健壮性,包括代码的可维护性、易读性、对输入的合法性的判断、对边界的考虑等等。
首先要考虑输入的合法性:正负数、空字符串、用户也可能输入“002321”这样的数字,或者输入非法字符以及包含字母的字符串。
然后要保证输出的样式:处理前置0,负数的输出
测试用例包括: 1. 输入:str1 = “”; str2 = “”; 输出:0 2. 输入:str1 = “1”; str2 = “”; 输出:0 3. 输入:str1 = “1”; str2 = “1”; 输出:1 4. 输入:str1 = “-1”; str2 = “2”; 输出:-2 5. 输入:str1 = “123243214235321523532532”; str2 = “23423423532525235”; 输出:28744334366315446528601263846558660129110 6. 输入:str1 = “-2134124324231432423”; str2 = “-2343243253252354”; 输出:4988437756366719702116393251241642 7. 输入:str1 = “-02343221”; str2 = “000031231232”; 输出:-72069456578272 8. 输入:str1 = “-023s4221”; str2 = “00s0031231232”; 输出:Please input string which only contains numbers
public static String bigNumberMultiply(String str1, String str2) { if (str1.equals("") || str2.equals("")) return "0"; String reminder = "Please input string which only contains numbers"; int len1 = str1.length(); int len2 = str2.length(); for (int i = 0; i < len1; i++) { if (str1.charAt(i) <= '9' && str1.charAt(i) >= '0') { continue; } else { return reminder; } } for (int i = 0; i < len2; i++) { if (str2.charAt(i) <= '9' && str2.charAt(i) >= '0') { continue; } else { return reminder; } } // get first char, judge sign char sign1 = str1.charAt(0); char sign2 = str2.charAt(0); char sign = '+'; if (sign1 == '+' || sign1 == '-') { sign = sign1; str1 = str1.substring(1); } if (sign2 == '+' || sign2 == '-') { if (sign == sign2) { sign = '+'; } else { sign = '-'; } str2 = str2.substring(1); } // reverse string and change to char[] char[] a = new StringBuilder(str1).reverse().toString().toCharArray(); char[] b = new StringBuilder(str2).reverse().toString().toCharArray(); int len_a = a.length; int len_b = b.length; // create an array to store result int len = len_a + len_b; int[] res = new int[len]; for (int i = 0; i < len_a; i++) { for (int j = 0; j < len_b; j++) { res[i + j] += (a[i] - '0') * (b[j] - '0'); } } // carry for (int i = 0; i < len; i++) { if (res[i] > 10) { res[i + 1]++; res[i] %= 10; } } // deal with forward 0 StringBuilder sb = new StringBuilder(); boolean flag = true; for (int i = len - 1; i >= 0; i--) { if (res[i] == 0 && flag) { continue; } else { flag = false; } sb.append(res[i]); } // deal with the sign of result and null input if (sign == '-') { sb.insert(0, sign); } return sb.toString(); }