【问题标题】:My solution to Project Euler #8 not working anymore我对 Project Euler #8 的解决方案不再起作用
【发布时间】:2017-03-23 16:24:28
【问题描述】:

所以,我在网上解决了一个问题,我在一个 1000 位数字中找到了任意 5 个连续数字的最大乘积:

        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时,它给了我一个错误的解决方案,,为什么?

【问题讨论】:

    标签: javascript arrays sorting for-loop numbers


    【解决方案1】:

    你的错误在for (var i = 0; i &lt; bigarray.length; i+=z) {

    1. 将循环条件更改为i &lt; bigarray.length - z。原因:由于内部 for 循环前进到 z 个索引,因此外部循环必须保证至少有 z 个元素从索引 i 中挖掘出来。

    2. 将循环增量更改为i+=1。原因:考虑在输入"1221" 中找到两个连续数字的最大乘积。 1*2 = 22*1 = 2 是您的算法计算的。然而,解决方案是2*2 = 4,只有在将每个输入数字视为可能的起点时才能找到它。

    完成这些更改后,您就可以开始优化算法了。例如,您可以重新使用上一次迭代中的 mult 值。

    【讨论】:

      【解决方案2】:

      你可以这样做;

      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));

      【讨论】:

      • 感谢您的努力,但您计算的是总和而不是乘积 + 我不想要新的解决方案我想知道我的代码有什么问题
      • @Ahmed Muhammad 哦,只是一个小小的误解。感谢您的提醒。现在应该没问题了。对不起,我不擅长调试。从头开始完成它要快得多。请把它作为一个想法供您将来参考。
      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多