【问题标题】:Why it is this program not finding pairs in an array that sum to a given value?为什么这个程序没有在数组中找到总和为给定值的对?
【发布时间】:2017-06-22 07:27:10
【问题描述】:

到目前为止我的代码:

#include<stdio.h>
int main() {
    int a[5][5] = {
        {-1, 2, 3, 4 },
        { 5, 3, -2, 1 },
        { 6, 7, 2, -3 },
        { 2, 9, 1, 4 },
        { 2, 1, -2, 0 }
    };
    int sum = 11;
    int i, j;
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            if (a[i][j] + a[j][i] == sum && i != j) {
                printf("%d %d\n", i, j);
            }
        }
    }
}

我想找到给定总和的对,使得对的元素位于不同的行中。

【问题讨论】:

  • 您应该告诉我们您的程序应该找到哪些元素。如果你打印所有的组合,你会看到没有总和是11:ideone.com/hYa7ZI
  • 因为c/c++是UB。
  • @SouravGhosh:是的,这是我最喜欢的; C/C++ 是 C 和 C++ 中的 UB。
  • @Ravi:如果您选择 C ​​或 C++,您将吸引更少的反对票。语言从 1999 年开始出现分化。

标签: c matrix


【解决方案1】:

请注意,a 是一个 5x5 数组,其中有一列额外的零。这有一个良性的影响。

您的算法有问题!如果您将条件调整为

if (a[i][j] + a[j][i] == sum && i != j) {
    printf("Yes %d %d\n", i, j);
} else {
    printf("No %d %d\n", i, j);
}

很明显,您没有考虑每个可能对的总和。巧合的是,被遗漏的是总和为 11 的对。

基本上您需要 4 个嵌套循环,并且您需要考虑数组中的每个数字与每个其他数字。

【讨论】:

    【解决方案2】:

    首先,您应该注意到您定义了一个5X5 int array,但在每个子数组中只填写了4 个ints。如果你要打印出你的数组,你会看到值是:

    -1      2       3       4       0
    5       3       -2      1       0
    6       7       2       -3      0
    2       9       1       4       0
    2       1       -2      0       0
    

    我猜这不是你的本意……

    现在,对于您的问题 - 您想为 i!=j 找到 a[i][j] + a[j][i] == 11。您没有得到输出的原因是因为您定义的数组中没有满足您条件的元素。

    【讨论】:

      【解决方案3】:

      以下程序将解决您的问题,

      #include<stdio.h>
      int main()
      {
              int a[5][5] = {
              {-1, 2, 3, 4 },
              { 5, 3, -2, 1 },
              { 6, 7, 2, -3 },
              { 2, 9, 1, 4 },
              { 2, 1, -2, 0 }
          };
              int sum=11,i,j,k,l;
              for(i=0;i<5;i++)
              {
                      for(j=i+1;j<5;j++)
                      {
                              for(k=0;k<5;k++)
                              {
                                      for(l=0;l<5;l++)
                                      {
                                              if(a[i][k]+a[j][l]==sum)
                                                      printf("a[%d][%d] = %d\ta[%d][%d] = %d\n",i,k,a[i][k],j,l,a[j][l]);
                                      }
                              }
                      }
              }
      }
      

      【讨论】:

        【解决方案4】:

        如果您想要“具有给定总和的对,使得对的元素位于不同的行中。”那么你应该尝试这样的代码:

        #include<stdio.h>
        int main()
        {
          const int rows = 5;
          const int cols = 4;
          int sum = 11;
          int i, j, i1, j1;
          int a[rows][cols] =
          {
            {-1, 2, 3, 4 },
            { 5, 3, -2, 1 },
            { 6, 7, 2, -3 },
            { 2, 9, 1, 4 },
            { 2, 1, -2, 0 }
          };
          for(i = 0; i < rows; i++)
            for(j = 0; j < cols; j++)
              for(i1 = i + 1; i1 < rows; i1++)
                for(j1 = 0; j1 < cols; j1++)
                  if(a[i][j] + a[i1][j1] == sum)
                     printf("[%d %d](%d); [%d %d](%d)\n", i, j, a[i][j], i1, j1, a[i1][j1]);
        }
        

        【讨论】:

        • 不是你的错,但这个答案现在无效,因为 OP 澄清它是 C 而不是 C++。
        • @Bathsheba OP 没有澄清它,πάντα ῥεῖ 选择(出于未知原因)它是 C.
        • @mch 什么是“等等”?还有其他问题吗?
        • @AustinPowers:尽量不要采用“如果它编译,就发送它”的口头禅;无论如何,除非你是对冲基金的股权合伙人。请注意,这不会与当前的 C 编译器一起编译。
        • @Bathsheba 你是什么意思?
        猜你喜欢
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        相关资源
        最近更新 更多