字符串的四則運算

題目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();
    }

至於字符串的除法,雖然是乘法的逆運算,但是每次的單次除法都會改變被除數的大小,並且還要用到乘法與減法運算,相對前三題而言,複雜太多。有興趣的讀者可以自己嘗試,如果有會做的大佬,感謝與我分享。

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