1

我正在尝试解决第 8 个 Project Euler 问题。

找出 1000 位数字中连续五位数字的最大乘积。

我很确定我已经走了。我还尝试了一个更简单的程序,它使用了一个每次都返回 1 的 while 循环。我提供的代码每次也返回 1。

请不要为我提供解决方案。如果可以的话,给我一个地方看看。这是我的代码:

var bigNum = "73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450";

var pos1, pos2, pos3, pos4, pos5;

for(var i=1;i<=1000;i+=5) {
   for(var j=0;j<=995;j++) {
       pos1 = bigNum[j];
   }
   for(var k=1;k<=996;k++) {
       pos2 = bigNum[k];
   }
   for(var l=2;l<=997;l++) {
       pos3 = bigNum[l];
   }
   for(var m=3;m<=998;m++) {
       pos4 = bigNum[m];
   }
   for(var n=4;n<=999;n++) {
       pos5 = bigNum[n];
   }
   prod = pos1 * pos2 * pos3 * pos4 * pos5;
   if(prod>sum) {
       sum = prod;
   }
}
console.log(sum);

这是我改进的代码:

var prod;
var largest =1;
for(var i=0;i<=995;i++) {
   prod=num[i] * num[i +1] * num[i +2] * num[i +3] * num[i + 4];
   if(prod>largest) {
     largest = prod;
   }
}

console.log(largest);
4

3 回答 3

1

想想你的代码中发生了什么。

您进入第一个 for 循环。然后进入第二个。您分配 pos1 = j,然后循环(j 仍然 <= 995)。

其他 4 个循环也是如此。所以每次 prod = 996*997*998*999*1000

于 2013-04-20T07:22:08.870 回答
1

我不确定没有示例可以说什么,这确实会导致解决方案。

我要做的是遍历字符串,取 5 个字符的切片,拆分这 5 个字符并在必要时将它们转换为数字,找到它们的乘积,检查它是否是迄今为止最大的,如果是则存储,取下一个5、冲洗并重复。

我不知道为什么你有这么多循环,而你只需要 1

no code displayed

对于那些希望看到的人来说, jsfiddle上有一个解决方案

于 2013-04-20T07:55:23.973 回答
1

您应该尝试一种更系统的方法来解决这个问题,而不是一次性深入研究代码。

首先,看看你是否可以用更小的输入手动解决问题。因此,例如,取原始输入字符串的前 10 位数字:7316717653. 现在尝试在纸上解决问题(也许用计算器,呵呵)。它可能会像这样

7*3*1*6*7 = 882
3*1*6*7*1 = 126
1*6*7*1*7 = 294
6*7*1*7*6 = 1764
7*1*7*6*5 = 1470
1*7*6*5*3 = 630
1764

下一步是我们如何将其转换为代码。让我们从写下我们上面所做的开始:

1) Start from the leftmost point
2) Take the next five numbers
3) Multiply them
4) Store the output
5) Shift to the right once
6) Repeat starting at 2), until there aren't five numbers left to process
7) Look through all of the products (the output of the multiplication)
8) Output the max

现在的挑战是将其转换为代码。由于您不想要解决方案,因此我将其留给您。但是您似乎在循环构造方面遇到了一些问题,所以也许我可以给您一个提示:

for(var i=1; i <= 1000; i+=5) {
    // code here
}

那段代码说:

1) Take a variable 'i' and set it to 1
2) While 'i' is less than or equal to 1000 execute "code here"
3) Increment 'i' by 5

因此,在问题的上下文中,您可能需要一个循环来跟踪当前最左边的点。它将从 0 开始,每次递增 1,并从末尾停止五个插槽,这意味着:

...823257530420752963450
                   ^

那里。

最后,我要补充一点,您按照我的建议生成的代码效率有点低。但是当你浏览代码时,你会发现一些简单的方法可以让它更快,感觉棒极了!希望你能解决它。但是请记住,项目 euler 没有时间限制,并且上述解决方案仍然会运行得非常快(在 javascript 中可能需要几秒钟?在 C 中肯定少于一秒钟)。

于 2013-04-20T08:31:53.150 回答