2013-04-20 69 views
1

我试图解决第8个项目欧拉问题。将特定位置的字符串中的数字相乘

查找1000位数字中连续5位数字的最大乘积。

我很确定我是走了。我还尝试了一个使用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); 

回答

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 
       ^

那里。

最后,我会补充说,根据我的建议,您要生成的代码效率很低。但是当你浏览代码时,你会发现简单的方法使其更快,这感觉很棒!希望你能解决它。但请记住,项目安装者没有时间限制,而且上述解决方案仍然运行得非常快(可能是JavaScript中的几秒钟,肯定不会超过一个)。

1

想想什么是你的代码发生的事情。

您输入1st for循环。然后你输入第二个。您分配pos1 = j,然后循环(j仍为< = 995)。

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

1

我不确定没有例子可以说什么,这导致了一个真正的解决方案。

我会做的是通过字符串循环,取5个字符切片,分裂这5个字符,并将它们转换为数字,如果有必要,找到他们的产品,检查它是否是迄今为止最大的存储,如果它们是,拿下5,冲洗并重复。

我不知道为什么你有这么多的循环,当你需要的是1

no code displayed 

一种解决方案是在jsfiddle为那些希望看到

相关问题