字符串的四则运算

题目1:字符串相加
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
注:不能使用任何内建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:由于在字符串上进行操作,所以不难想到字符串的拼接(append),又由于字符串中的字符是表示ANSI值不能直接将其视为数字进行拼接,所以便想到让其与’0’字符作差后再进行作和和拼接。
具体代码如下:

public String addStrings(String num1, String num2) {
        StringBuilder sb = new StringBuilder();
        int tmp = 0;
        int a = num1.length() - 1;
        int b = num2.length() - 1;
        while (a >= 0 || b >= 0 || tmp != 0) {//此处的tmp != 0是处理类似80+20=100这种进位的情况发生
            if (a >= 0) {
                tmp += num1.charAt(a--) - '0';
            }
            if (b >= 0) {
                tmp += num2.charAt(b--) - '0';
            }
            sb.append(tmp % 10);//只拼接当前下标的一位数字,超出的位数的数字进给下一个下标进行处理
            tmp /= 10;
        }
        return sb.reverse().toString();
    }

题目二:字符串相减
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的差。
(默认num1比num2大)
注:不能使用任何内建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:减法是加法的逆运算,所以基本思路与上述思路相似,只不过要注意减法中的借位的处理方式。
具体代码如下:

public String subString(String num1,String num2) {
        StringBuilder sb = new StringBuilder();
        int amd = 0;
        int count = 0;//用于处理借位
        int a = num1.length() - 1;
        int b = num2.length() - 1;
        while (a >= 0) {
            int tmp = num1.charAt(a--) - '0' - count;
            if (b == -1) {
                amd = 0;
            }
            if (b >= 0) {
                amd = num2.charAt(b--) - '0';
            }
            if (tmp < amd) {
                sb.append(tmp - amd + 10);
                count = 1;
            }
            else {
                sb.append(tmp - amd);
                count = 0;
            }
        }
        int i = sb.length() - 1;
        while (i > 0 && sb.charAt(i) == '0') {//记录多余的字符'0'
            i--;
        }
        return sb.reverse().toString().substring(sb.length() - i - 1);
    }

题目三:字符串相乘
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的积。
注:不能使用任何内建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。
思路:由于乘法和加法不一样,可能会产生许多新的下标位,所以此时便想到新建一个数组的来保存并操作数据,最后再把数组作为字符串返回即可。至于如何操作数组元素,核心思想与加法类似。
具体代码如下:

public String multiply(String num1, String num2) {
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        StringBuilder sb = new StringBuilder();
        int a = num1.length() - 1;
        int b = num2.length() - 1;
        int[] arr = new int[num1.length() + num2.length()];//保存并操作数据的数组
        //两重循环把每一位数因进行的乘积都遍历到
        for (int i = a; i >= 0; i--) {
            int amd = num1.charAt(i) - '0';
            for (int j = b; j >= 0; j--) {
                int tmp = num2.charAt(j) - '0';
                arr[i + j] += amd * tmp;
                if (arr[i + j] >= 10 && (i + j) != 0) {
                    arr[i + j - 1] += arr[i + j] / 10;
                    arr[i + j] %= 10;
                }
            }
        }
        //arr[0]可以保存两位数字,正好把循环内部的0下标的缺陷弥补上
        for (int i = 0; i < arr.length - 1; i++) {
            sb.append(arr[i]);
        }
        return sb.toString();
    }

至于字符串的除法,虽然是乘法的逆运算,但是每次的单次除法都会改变被除数的大小,并且还要用到乘法与减法运算,相对前三题而言,复杂太多。有兴趣的读者可以自己尝试,如果有会做的大佬,感谢与我分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章