Project Euler 8 Javascript


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的末尾的九个块中,答案显然为4 x 9。但是,发生的事情是,一旦倍数开始变得更少(即在第一个2九和2八个八个块之后),结果不再存储,并且8 x 9 x 9 x 8的结果是回。我该如何告诉我的代码继续通过var num?

一直寻找大倍数

,而不是将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并不是num的所有数字的字符串。相反,它是其科学符号的一串。检查一下:

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

和(1.0234657899876543e 25)超过了max_safe_integer:

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