字符串相乘- [Leetcode] Java问题

qmb5sa22  于 2022-12-28  发布在  Java
关注(0)|答案(3)|浏览(132)

问题是

给定两个表示为字符串的非负整数num 1和num 2,返回num 1和num 2的乘积,也表示为字符串。
注意:您不能使用任何内置的BigInteger库或直接将输入转换为整数。

代码:

class Solution {
    public String multiply(String num1, String num2) {
        long n1=0, n2=0, res;
        n1 =  Long.parseLong(num1);
        n2 =  Long.parseLong(num2);
        res = n1 * n2;
        String str = Long.toString(res);
        return str;
    }
}

问题是

它的工作正常时,我给予较小的数字是这样:
输入:40、90
产量:3600
输入:100,2099
产量:209900
如果我给予输入:
输入:498828660196、840477629533
输出:“-3269442614257959980”
但实际输出为:419254329864656431168468。我不知道为什么会有这样的答案。我也使用长数据类型。有人能解释一下并给予解决这个问题的方法吗?

jyztefdp

jyztefdp1#

因为你是用长整型存储的,长整型的取值范围是10^18,但是得到的结果是10^23,所以它会抛出一些垃圾值,因为它超出了存储范围,这就是为什么你有字符串的返回类型,因为你可以用字符串存储它,而不是长整型数据类型。

ibps3vxo

ibps3vxo2#

长整型存储在64位上,最大容量为2^63 - 1(9.223372e+18)所以你超出了范围。我建议你把你的测试推得太远了。如果它没有被禁止,你本可以改成BigInteger,或者改成float,但是为了你的问题,假设这些数字超出范围是可以的,如果你愿意,你可以检查输入是否低于10^9并抛出超出范围错误。

ff29svar

ff29svar3#

谢谢你们!
我找到了解决方案。

class Solution {
    public String multiply(String num1, String num2) {
         if (num1.equals("0") || num2.equals("0")) return "0";
        int l1 = num1.length(), l2 = num2.length(), l = l1 + l2;
        char[] ans = new char[l];
        char[] c1 = num1.toCharArray();
        char[] c2 = num2.toCharArray();
        for (int i = l1 - 1; i >= 0; --i) {
            int c = c1[i] - '0';
            for (int j = l2 - 1; j >= 0; --j) {
                ans[i + j + 1] +=  c * (c2[j] - '0');
            }
        }
        for (int i = l - 1; i > 0; --i) {
            if (ans[i] > 9) {
                ans[i - 1] += ans[i] / 10;
                ans[i] %= 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        int i = 0;
        for (; ; ++i) if (ans[i] != 0) break;
        for (; i < ans.length; ++i) sb.append((char) (ans[i] + '0'));
        return sb.toString();
    }
}

相关问题