程序的健壮性(以大数相乘为例)

以大数相乘为例,思考怎样写出一个健壮的程序


大数相乘

思路就是采用模拟手乘的方法,没有难度,本文重点不在于怎么写出大数相乘的算法。

我是想通过写这么一个方法,告诉自己写程序时要保证程序的健壮性,包括代码的可维护性、易读性、对输入的合法性的判断、对边界的考虑等等。

首先要考虑输入的合法性:正负数、空字符串、用户也可能输入“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();
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值