大数相乘:Java实现

public class MultiOfLargeNumbers {
    public String multiString(String str1, String str2){
        // 判断正负号
        int signOfStr1 = str1.startsWith("-") ? 1 : 0;
        int signOfStr2 = str2.startsWith("-") ? 1 : 0;
        // 将数字逆序放到整型数组中
        int[] arrOfStr1 = new int[str1.length() - signOfStr1];
        for (int i = 0; i < arrOfStr1.length; i++) {
            arrOfStr1[i] = str1.charAt(str1.length() - 1 - i) - '0';
        }
        int[] arrOfStr2 = new int[str2.length() - signOfStr2];
        for (int i = 0; i < arrOfStr2.length; i++) {
            arrOfStr2[i] = str2.charAt(str2.length() - 1 - i) - '0';
        }
        // 开始运算
        StringBuffer subResult = new StringBuffer(); // 过渡结果
        for (int i = 0; i < arrOfStr2.length; i++) {
            StringBuffer midResult = new StringBuffer(); //每位的运算结果
            int valueOfCurrBit = 0; // 每位相乘时当前位上的数字
            int valueOfNextBit = 0; // 每位相乘时进位上的数字
            for (int k = 0; k < i; k++) {
                midResult.append(0);
            }
            for (int j = 0; j < arrOfStr1.length; j++) {
                valueOfCurrBit = (arrOfStr2[i] * arrOfStr1[j] + valueOfNextBit) % 10;
                valueOfNextBit = (arrOfStr2[i] * arrOfStr1[j] + valueOfNextBit) / 10;
                midResult.append(valueOfCurrBit);
            }
            if (valueOfNextBit > 0) {
                midResult.append(valueOfNextBit);
            }
            // 执行相加运算,结果存储在subResult中
            subResult = addString(subResult, midResult);
        }
        if (signOfStr1 + signOfStr2 == 1) {
            subResult.append('-');
        }
        return subResult.reverse().toString();
    }

    private StringBuffer addString(StringBuffer subResult, StringBuffer midResult){
        int diff = Math.abs(midResult.length() - subResult.length());
        StringBuffer sb = new StringBuffer();
        while (diff-- > 0) {
            sb.append(0);
        }
        if (midResult.length() > subResult.length()) {
            subResult.append(sb);
        } else {
            midResult.append(sb);
        }
        int currentBit = 0;
        int carryBit = 0;
        for (int i = 0; i < subResult.length(); i++) {
            currentBit = ((subResult.charAt(i) - '0') + (midResult.charAt(i) - '0') + carryBit) % 10;
            carryBit = ((subResult.charAt(i) - '0') + (midResult.charAt(i) - '0') + carryBit) / 10;
            subResult.setCharAt(i, (char) (currentBit + '0'));
        }
        if (carryBit > 0) {
            subResult.append(carryBit);
        }
        return subResult;
    }

    public static void main(String[] args) {
        String str1 = "-123456789";
        String str2 = "987654321";
        MultiOfLargeNumbers test = new MultiOfLargeNumbers();
        System.out.println(test.multiString(str1, str2));
    }
}