2016-12-25 4 views
1
var num = 10234657899876543299999991; 
var strNum = num.toString(); 
var total = 1; 
var greatest = 1; 

for(var start = 0; start <= strNum.length; start ++){ 
    for(var i = start; i <= start + 3; i ++){ 
    total *= strNum.charAt(i); 
} 
    if(total > greatest){ 
    greatest = total; 
    } 
    total = 1; 
} 

alert(greatest); 

私のコードは、var numをループし、4つの連続する数字のうち最も高い倍数を返すように設計されています。この例では、答えはvar numの最後に向かって9行目のブロックではっきりと4 x 9です。しかし、何が起こっているのかは、複数の開始点が少なくなると(つまり、最初の2つのブロックと2つの8のブロックの後)、結果は保存されなくなり、8 x 9 x 9 x 8の結果が戻ってきた。どのようにして、var numによって大きな倍数を探し続けるようにコードに指示することができますか?プロジェクトオイラー8 Javascript

答えて

1

代わりの文字列にnumの変換、すでにそれを文字列として格納します。

var strNum = "10234657899876543299999991"; 

これはあなたに9^4(または6561)で期待される結果を、与える:

var strNum = "10234657899876543299999991"; 
 
var total = 1; 
 
var greatest = 1; 
 

 
for(var start = 0; start <= strNum.length; start ++){ 
 
    for(var i = start; i <= start + 3; i ++){ 
 
    total *= strNum.charAt(i); 
 
} 
 
    if(total > greatest){ 
 
    greatest = total; 
 
    } 
 
    total = 1; 
 
} 
 

 
alert(greatest);

問題はあなたのコードでは、strNumが正確に012の全桁の文字列ではない、ということです。代わりに、それはその科学的記法の文字列です。このことを確認します。

var num = 10234657899876543299999991; 
 
var strNum = num.toString(); 
 
console.log(strNum);

そして、それ(1.0234657899876543e + 25)はMAX_SAFE_INTEGER以上の方法である:

console.log(Number.MAX_SAFE_INTEGER.toExponential())

+0

ブリリアント、ありがとう!私はそれがとても簡単な修正であったことを嬉しく思います。 – Jackets82