1

/ % * を使用せずに式a/b = e^(ln a - ln b)を使用して悪名高い質問を解決しようとしましたが、一部のテストケースでは解決策が失敗します。Divide 2 Integers(dividend=Integer.MAX_VALUE or MIN_VALUE and divisor=1)

なぜ失敗するのですか?

[編集]: そのテスト ケースに対して私が得た答えは(MAX-1 or MIN+1). なぜこれが起こるのか知りたいです。

public int divide(int dividend, int divisor) {
    boolean neg = false;
    if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0))
        neg = true;

    long a = dividend;
    a = Math.abs(a);
    long b = divisor;
    b = Math.abs(b);

    double res = Math.pow(Math.E, Math.log(a) - Math.log(b));
    int ans = Math.floor(res);
    return neg ? -ans : ans;
}
4

1 に答える 1

4

ここでの問題の根源は、計算の中間結果にあります。

double は浮動小数点型なので、使用すると精度が落ちる場合があります。

中間計算で double を使用します。

double res = Math.pow(Math.E, Math.log(a) - Math.log(b));
int ans = Math.floor(res);

たとえば、5 と 1、res = 4.999999999999 を使用すると、Math.floor(res) は 4 を返します。

Integer.MAX_VALUE では 2147483647 (元の値) ですが、結果は 2147483646 です。理由は 5 の場合とまったく同じです。

于 2013-01-19T23:12:03.563 に答える