数量非常大的产品

时间:2017-06-18 09:23:52

标签: java

如何将两个100位数字相乘,这些数字作为字符串输入。 注意:我们不允许使用java的BigInteger或BigDecimal类。

1 个答案:

答案 0 :(得分:2)

你能做的就是你在高中时学到的东西。因此,您获取第二个数字的最低位,并在第一个数字上一直向上迭代,然后执行第二个数字并将结果相加,直到得到总数。基本上你只需手动自动化你通常做的事情。

为了举例说明如何执行此操作,我可以向您展示以下代码,因为我发现这些问题对于初学程序员来说非常困难。它应该显示出良好的程序组成以及完成任务所需的许多技术。

当然,它缺少一个重要的实施方案:)。

public class DecimalNumber {

    public static String multiply(String x, String y) {
        String intermediateResult = "0";
        for (int i = 0; i < y.length(); i++) {
            char ydc = y.charAt(y.length() - i - 1);
            int yd = toDigitValue(ydc);
            String result = multiply(yd, x);
            String shiftedResult = shift(i, result);
            intermediateResult = add(intermediateResult, shiftedResult);
        }
        return intermediateResult;
    }

    private static String add(String x, String y) {
        int digitsToAdd = Math.max(x.length(), y.length());
        StringBuilder result = new StringBuilder(1 + digitsToAdd);

        int carry = 0;
        for (int i = 0; i < digitsToAdd; i++) {
            int xd;
            if (i >= x.length()) {
                xd = 0;
            } else {
                char xdc = x.charAt(x.length() - i - 1);
                xd = toDigitValue(xdc);
            }

            int yd;
            if (i >= y.length()) {
                yd = 0;
            } else {
                char ydc = y.charAt(y.length() - i - 1);
                yd = toDigitValue(ydc);
            }

            int digitAdd = xd + yd + carry;
            if (digitAdd >= 10) {
                carry = digitAdd / 10;
                digitAdd = digitAdd % 10;
            } else {
                carry = 0;
            }
            char digitMulChar = toDigitCharacter(digitAdd);
            result.insert(0, digitMulChar);
        }
        if (carry != 0) {
            result.insert(0, carry);
        }
        return result.toString();
    }

    private static String shift(int shift, String valueToShift) {
        StringBuilder result = new StringBuilder(valueToShift.length() + shift);
        result.append(valueToShift);
        for (int i = 0; i < shift; i++) {
            result.append('0');
        }
        return result.toString();
    }

    private static String multiply(int yd, String x) {
        // TODO implement
        throw new IllegalStateException("Method not implemented");
    }

    private static int toDigitValue(char digitAsCharacter) {
        return Integer.parseInt("" + digitAsCharacter);
    }

    private static char toDigitCharacter(int digitValue) {
        return Character.forDigit(digitValue, 10);
    }

    public static void main(String[] args) {
        System.out.println(multiply("999", "999"));
    }
}

我实际上曾经在软件中找到过这种代码。不要那样做,只需使用一个以字节为单位的大整数库。或者更确切地说,如果您想要任何类型的性能,可以使用64位long值。

请注意,如果您已经学过如何执行快速二进制操作的课程,则可能需要复制该操作而不是上面的答案。