9

私は Rosalind 問題Mortal Fibonacci Rabbitsに取り組んでいますが、JavaScript で記述されたアルゴリズムを使用すると、Web サイトは私の答えが間違っていると言い続けます。Python で同じアルゴリズムを使用すると、別の (そして正しい) 答えが得られます。

不整合は、結果が大きくなった場合にのみ発生します。たとえば、JavaScript でfibd(90, 19)は戻りますが、Python では.28700485612337306002870048561233731259

JavaScript の数値について、別の答えが得られたり、JavaScript コードで微妙な間違いを犯したりすることはありますか?

JavaScript ソリューション:

function fibd(n, m) {
    // Create an array of length m and set all elements to 0
    var rp = new Array(m);
    rp = rp.map(function(e) { return 0; });
    rp[0] = 1;

    for (var i = 1; i < n; i++) {
        // prepend the sum of all elements from 1 to the end of the array
        rp.splice(0, 0, rp.reduce(function (e, s) { return s + e; }) - rp[0]);
        // Remove the final element
        rp.pop();
    }

    // Sum up all the elements
    return rp.reduce(function (e, s) { return s + e; });
}

Python ソリューション:

def fibd(n, m):
    # Create an array of length m and set all elements to 0
    rp = [0] * m
    rp[0] = 1

    for i in range(n-1):
        # The sum of all elements from 1 the end and dropping the final element
        rp = [sum(rp[1:])] + rp[:-1]

    return sum(rp)
4

2 に答える 2

13

Javascriptには「Number」データ型しかないと思いますが、これは実際には内部でIEEE doubleです。2,870,048,561,233,730,600 は、IEEE double で正確に保持するには大きすぎるため、概算されます。(末尾の "00" に注意してください - 小数点以下 17 桁が double にほぼ適しています。)

一方、Python は bignum をサポートしており、4096 ビットの整数を非常に快く処理します (暗号化アルゴリズムをいじっている人にとって、これは大きな恩恵です)。

君はそうかもしれないたとえば、 http: //silentmatt.com/biginteger/ のように検索すると、Javascript bignum ライブラリを見つけることができます。

于 2015-12-10T09:17:53.607 に答える