所以,我在网上解决了一个问题,在那里我找到了任意5个连续数字的最大产品在1000位数字中:
var bignumber = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
var bigarray = bignumber.split("");
var prod = [];
var buy = 1;
var z = 4;
for (var i = 0; i < bigarray.length; i+=z) {
mult = bigarray[i];
for (var x = 1; x <= z; x++) {
mult *= bigarray[i+x];
}
prod.push(mult);
}
prod.sort(function(a, b){return b-a});
document.write(prod[0]);
其中z可以是我想要的连续数字减1,解决方案是40824,这是正确的我认为solution
后来我发现这个问题属于Project Euler here,而是它的13个连续数字,所以当我试图改变z = 12时,它给了我一个不正确的解决方案,为什么?
答案 0 :(得分:0)
您可以执行以下操作;
function getMaxProductConseq(s,n){
return Math.max(...s.split("")
.map((_,i,a) => a.slice(i,i+n))
.slice(0,s.length-n+1)
.map(sa => sa.reduce((p,c) => +p * +c)));
}
var bignumber = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450";
console.log(getMaxProductConseq(bignumber,13));
&#13;
答案 1 :(得分:0)
你的错误在第for (var i = 0; i < bigarray.length; i+=z) {
行:
将循环条件更改为i < bigarray.length - z
。原因:由于内部for循环前进到z索引,外部循环必须保证至少有z个元素从索引i
提醒。
将循环增量更改为i+=1
。原因:考虑在输入"1221"
中找到两个连续数字的最大乘积。 1*2 = 2
和2*1 = 2
是您的算法计算的内容。然而,解决方案是2*2 = 4
,只有在考虑每个输入数字作为可能的起点时才能找到它。
完成这些更改后,您就可以开始优化算法了。例如,您可以重复使用上一次迭代中的mult
值。