以大数相乘为例,思考怎样写出一个健壮的程序
大数相乘
思路就是采用模拟手乘的方法,没有难度,本文重点不在于怎么写出大数相乘的算法。
我是想通过写这么一个方法,告诉自己写程序时要保证程序的健壮性,包括代码的可维护性、易读性、对输入的合法性的判断、对边界的考虑等等。
首先要考虑输入的合法性:正负数、空字符串、用户也可能输入“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 = “-023s4%3221”; 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();
}