2015-12-10 2 views
9

で同じアルゴリズムに異なる答えを与えています。 Pythonで同じアルゴリズムを使用すると、私は別の(そして正しい)答えを得ます。Javascriptが私はロザリンドの問題<a href="http://rosalind.info/problems/fibd/">Mortal Fibonacci Rabbits</a>に取り組んでいるとのウェブサイトは、私は私のアルゴリズム書かれたJavaScriptを使用している場合、私の答えは間違っている私に言って続けてPythonの

矛盾結果が大きくなる場合にのみ発生します。例えばfibd(90, 19) JavaScriptで2870048561233730600を返しますが、Pythonで、私は2870048561233731259を取得します。

私に異なる答えを与えるか、私の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; }); 
} 

ザ・パイソン・ソリューション:

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) 
+0

戻りますか?私はあなたのコードを実行し、入力(10,10)と同じ結果を返します。 "; - ([0] RP)0、0、rp.reduce(関数(E、S){リターンS +電子}); rp.splice" しかし、私はミスを見ることができます。そうかもしれない?そうでなければ、相違点がありますか? –

+0

良い点。私は例を追加しました。それはより大きな入力に起こります。タイプミスをうまくキャッチする。ありがとうございますが、それは問題ではありません。それは問題の変数名を同じにしようとしている私だけでした。タイプミスが修正されました – Cristian

答えて

13

私はJavascriptが唯一の "数" のデータ型を持っていると思うし、ボンネットの下に、この実際にはIEEEダブル。 2,870,048,561,233,730,600はIEEEダブルで正確に保持するには大きすぎるため、近似しています。 (末尾の "00" - 小数点以下17桁は二重引用符に近いことに注意してください)

一方、Pythonはbignumをサポートしています。暗号アルゴリズムで遊んでいる人にとっては、これは大きな恩恵です)。あなたが検索した場合

あなたのJavascript BIGNUMライブラリを見つけることができるようになりかもしれない - ただ、研究のビットを行う例えばhttp://silentmatt.com/biginteger/

7

、この記事は面白いようです。 Pythonが所与Javascript only supports 53bits integers.

結果は、JSのための最大安全範囲外に確かです。あなたは

parseInt('2870048561233731259') 

を実行しようとした場合それは確かにあなたが例を与えることができ

2870048561233731000 
関連する問題