我正在尝试解决第8个项目欧拉问题。
找到1000位数字中连续五位数的最佳乘积。
我很确定我离开了。我还尝试了一个更简单的程序,使用while循环,每次返回1。我提供的代码每次都返回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);
答案 0 :(得分:1)
想想代码中发生了什么。
您输入第一个for循环。然后你输入第二个。你指定pos1 = j,然后循环(j仍然是&lt; = 995)。
另外4个循环也是如此。所以每次prod = 996 * 997 * 998 * 999 * 1000
答案 1 :(得分:1)
我不确定没有例子可以说什么,这导致了解决方案。
我要做的是循环遍历字符串,取5个字符,分割这5个字符并在必要时将它们转换为数字,找到它们的产品,检查它是否是迄今为止最大的并存储,如果它们是,接下来的5,冲洗并重复。
我不知道为什么你有这么多的循环,当你需要的只是1
no code displayed
对于那些希望看到
的人来说,解决方案是jsfiddle答案 2 :(得分: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中肯定不到一秒)。