当试图为项目euler 11找到数组中最大的产品时,得到了尴尬的结果

Getting awkward results when trying to find largest product in array for project euler 11

本文关键字:结果 项目 euler 数组      更新时间:2023-10-16

我被要求在项目euler问题11的20x20网格中,水平、对角或垂直地找到4个相邻数字的最大乘积。网格可在此处找到:http://projecteuler.net/problem=11.

我找不到比在整个阵列上循环4次更有效的方法了。我制作了一个变量max,最初设置为0。然后,我水平地在数组上循环,找到了产品。如果一个乘积大于max,则将max设置为该乘积,等等。我对所有4个循环都这样做了。然而,我的答案是错误的,而且可能太大了。

#include <iostream>

using namespace std;
int main () {
int twenty_grid[20][20] =
{
    { 8,  2, 22, /* data elided since the question links to it */ },
    … 
}
int max = 0;
// Pass 1: This determines the greatest element horizontally
for (int i = 0; i < 20; ++i) {
    for (int j = 0; j < 17; ++j) { 
        // j stops at 17 to avoid a segmentation fault.
        int n = twenty_grid[i][j] * 
                twenty_grid[i][j+1] * 
                twenty_grid[i][j+2] * 
                twenty_grid[i][j+2] * 
                twenty_grid[i][j+3];
        if (n > max)
            max = n;
    }
}
// Now we do the same loop, except we do i + 1, i + 2, etc, 
// rather than j +1, j+2. This does it vertically. Pass 2:
for (int i = 0; i < 17; ++i) {
    for (int j = 0; j < 20; ++j) {
        int n = twenty_grid[i][j] * 
                twenty_grid[i+1][j] * 
                twenty_grid[i+2][j] * 
                twenty_grid[i+3][j];
        if (n > max) {
            max = n;
        }
    }
}
// Finally, we increment both i and j to get the diagonals.
for (int i = 0; i < 17; ++i) {
    for (int j = 0; j < 20; ++j) {
        int n = twenty_grid[i][j] * 
                twenty_grid[i+1][j+1] * 
                twenty_grid[i+2][j+2] * 
                twenty_grid[i+3][j+3];
        if (n > max) {
            max = n;
        }
    }
}
// For diagonals, 2 passes are needed to account for both directions.
for (int i = 0; i < 17; i++) {
    for (int j = 3; j < 20; j++) {
        int n = twenty_grid[i][j] * 
                twenty_grid[i + 1][i -1] * 
                twenty_grid[i + 2][i -2] * 
                twenty_grid[i + 3][i -3];
        if (n > max)
            max = n;
    }
}
cout << max << endl;
return 0;
}

为了了解为什么我的答案总是错误的,我开始打印出每一个单独的产品。令我惊讶的是,其中许多都是负面的。在检查了我的循环之后,它们似乎不会访问数组中的任何数据。有人能指引我修复这个代码的正确方向吗?

我发现了几个问题。

  • 第一个代码块将twenty_grid[i][j+2]相乘两次
  • 在代码的第三块中,内部循环的结束条件应该是j < 17
  • 最后一块代码在三个位置使用i而不是j作为数组索引

它会在解决这些问题后得出正确的答案。