0

我一直在尝试解决 Project Euler 问题 11。我已经多次重新检查了我的代码,但在调试之后,我的程序仍然没有提供任何答案

问题指出,我们需要找到 4 个连续数字的最大乘积:以下代码中给出的矩阵的垂直、水平或对角线:

这是我的代码。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int matr[20][20] =
   {
    {8,  2,  22, 97, 38, 15, 0,  40, 0,  75, 4,  5,  7,  78, 52, 12, 50, 77, 91, 8},
    {49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4,  56, 62, 0},
    {81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3,  49, 13, 36, 65},
    {52, 70, 95, 23, 4,  60, 11, 42, 69, 24, 68, 56, 1,  32, 56, 71, 37, 2,  36, 91},
    {22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},
    {24, 47, 32, 60, 99, 3,  45, 2,  44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50},
    {32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70},
    {67, 26, 20, 68, 2,  62, 12, 20, 95, 63, 94, 39, 63, 8,  40, 91, 66, 49, 94, 21},
    {24, 55, 58, 5,  66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72},
    {21, 36, 23, 9,  75, 0,  76, 44, 20, 45, 35, 14, 0,  61, 33, 97, 34, 31, 33, 95},
    {78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3,  80, 4,  62, 16, 14, 9,  53, 56, 92},
    {16, 39, 5,  42, 96, 35, 31, 47, 55, 58, 88, 24, 0,  17, 54, 24, 36, 29, 85, 57},
    {86, 56, 0,  48, 35, 71, 89, 7,  5,  44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58},
    {19, 80, 81, 68, 5,  94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4,  89, 55, 40},
    {4,  52, 8,  83, 97, 35, 99, 16, 7,  97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66},
    {88, 36, 68, 87, 57, 62, 20, 72, 3,  46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69},
    {4,  42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8,  46, 29, 32, 40, 62, 76, 36},
    {20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4,  36, 16},
    {20, 73, 35, 29, 78, 31, 90, 1,  74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5,  54},
    {1,  70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1,  89, 19, 67, 48}
   };


    int horProduct=0, verProduct=0, diagright=0, diagleft=0;
    int maxProduct = 0;

   // horizontal product
   for (int i = 0; i < 20; i++)
   {
       for(int j = 0; j < 17; j++)
       {
            horProduct = matr[i][j]*matr[i][j+1]*matr[i][j+2]*matr[i][j+3];
       }
       if(horProduct > maxProduct)
       {
            maxProduct = horProduct;
       }
   }

   //vertical product
    for (int j = 0; j < 20; j++)
   {
       for(int i = 0; i < 17; i++)
       {
            verProduct = matr[i][j]*matr[i+1][j]*matr[i+2][j]*matr[i+3][j];
       }
       if(verProduct > maxProduct)
       {
            maxProduct = verProduct;
       }
   }

   //diagonal right
    for (int i = 0; i < 17; i++)
   {
       for(int j = 0; j < 17; j++)
       {
            diagright = matr[i][j]*matr[i+1][j+1]*matr[i+2][j+2]*matr[i+3][j+3];
       }
       if(diagright > maxProduct)
       {
            maxProduct = diagright;
       }
   }

   //diagonal left
    for (int i = 19; i > 3; i--)
   {
       for(int j = 19; j > 3; j--)
       {
            diagleft = matr[i][j]*matr[i-1][j-1]*matr[i-2][j-2]*matr[i-3][j-3];
       }
       if(diagleft > maxProduct)
       {
            maxProduct = diagleft;
       }
   }

   printf("final largest product: %d\n", maxProduct);

   return 0;
}

请让我知道这里出了什么问题。为什么我的程序不能打印任何输出?

4

1 回答 1

0

我犯了一个菜鸟错误。与 maxProduct 的比较应该在第二个循环内。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int matr[20][20] =
   {
    {8,  2,  22, 97, 38, 15, 0,  40, 0,  75, 4,  5,  7,  78, 52, 12, 50, 77, 91, 8},
    {49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4,  56, 62, 0},
    {81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3,  49, 13, 36, 65},
    {52, 70, 95, 23, 4,  60, 11, 42, 69, 24, 68, 56, 1,  32, 56, 71, 37, 2,  36, 91},
    {22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},
    {24, 47, 32, 60, 99, 3,  45, 2,  44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50},
    {32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70},
    {67, 26, 20, 68, 2,  62, 12, 20, 95, 63, 94, 39, 63, 8,  40, 91, 66, 49, 94, 21},
    {24, 55, 58, 5,  66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72},
    {21, 36, 23, 9,  75, 0,  76, 44, 20, 45, 35, 14, 0,  61, 33, 97, 34, 31, 33, 95},
    {78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3,  80, 4,  62, 16, 14, 9,  53, 56, 92},
    {16, 39, 5,  42, 96, 35, 31, 47, 55, 58, 88, 24, 0,  17, 54, 24, 36, 29, 85, 57},
    {86, 56, 0,  48, 35, 71, 89, 7,  5,  44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58},
    {19, 80, 81, 68, 5,  94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4,  89, 55, 40},
    {4,  52, 8,  83, 97, 35, 99, 16, 7,  97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66},
    {88, 36, 68, 87, 57, 62, 20, 72, 3,  46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69},
    {4,  42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8,  46, 29, 32, 40, 62, 76, 36},
    {20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4,  36, 16},
    {20, 73, 35, 29, 78, 31, 90, 1,  74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5,  54},
    {1,  70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1,  89, 19, 67, 48}
   };


    int horProduct=0, verProduct=0, diagright=0, diagleft=0;
    int maxProduct = 0;

   // horizontal product
   for (int i = 0; i < 20; i++)
   {
       for(int j = 0; j < 17; j++)
       {
            horProduct = matr[i][j]*matr[i][j+1]*matr[i][j+2]*matr[i][j+3];
            if(horProduct > maxProduct)
       {
            maxProduct = horProduct;
       }
       }
       
   }
    printf("hori: %d\n", maxProduct);
    
    for (int j = 0; j < 20; j++)
   {
       for(int i = 0; i < 17; i++)
       {
            verProduct = matr[i][j]*matr[i+1][j]*matr[i+2][j]*matr[i+3][j];
            if(verProduct > maxProduct)
       {
            maxProduct = verProduct;
       }
       }
       
   }
   
    printf("verti: %d\n", maxProduct);
    
     //diagonal right
    for (int i = 0; i < 17; i++)
   {
       for(int j = 0; j < 17; j++)
       {
            diagright = matr[i][j]*matr[i+1][j+1]*matr[i+2][j+2]*matr[i+3][j+3];
            if(diagright > maxProduct)
       {
            maxProduct = diagright;
       }
       }
       
   }

    printf("diagright: %d\n", maxProduct);
   //diagonal left
    for (int i = 0; i < 20 ; i++)
   {
       for(int j = 0; j < 17; j++)
       {
            diagleft = matr[i][j]*matr[i+1][j+1]*matr[i+2][j+2]*matr[i+3][j+3];
            if(diagleft > maxProduct)
       {
            maxProduct = diagleft;
       }
       }
       
   }
   
   printf("diagleft: %d\n", maxProduct);

   
   
return 0;
}   
于 2021-09-13T04:14:57.747 回答