【问题标题】:Ignore i And j’s same value in loop在循环中忽略 i 和 j 的相同值
【发布时间】:2019-12-05 20:58:23
【问题描述】:

我想通过将 2 个索引的最大组合相加来打印可行的解决方案,其中 n 个索引的值不能添加到自身中

4 个索引的预期输出 1,2 1,3 1,4 2,1 2,3 2,4 3,1 3,2 3,4 4,1 4,2 4,3

我哪里出错了 ::(这是我的代码)

for(i=1;i<n;i++)
{
    for(j=1; j!=i && j<n; j++)
    {
        printf("%d,%d",i,j);
    }
}

【问题讨论】:

    标签: c loops for-loop if-statement printf


    【解决方案1】:

    您正在检查内部循环中的条件,即在 j 循环中 所以你在内部循环中检查条件 j!=i ,因为这些如果条件为 false 那么它不会执行 j 循环,

    试运行:-

    考虑 n 的值为 4 ...

    首先 i=1 , i

    int main(){

        int n;
    
        printf("\nENTER THE NUMBER OF INDEXES : ");
        scanf("%d",&n);
    
        for(int i=1 ; i<=n ; i++){
    
                for(int j=1 ; j<=n ; j++){
    
                        if(i!=j)
                                printf("%d %d    ",i,j);
                }
        }
    
        printf("\n");
    
        return 0;
    

    }

    【讨论】:

      【解决方案2】:

      这是一个迄今为止没有人提出过的解决方案。:)

      #include <stdio.h>
      
      int main(void) 
      {
          unsigned int n = 5;
      
          for ( unsigned int i = 1; i < n; i++ )
          {
              for ( unsigned int j = 1; j < n; j++ )
              {
                  ( void )( i != j && printf( "%d,%d ", i, j ) );
              }
          }
      
          return 0;
      }
      

      程序输出是

      1,2 1,3 1,4 2,1 2,3 2,4 3,1 3,2 3,4 4,1 4,2 4,3 
      

      至于你的代码然后这个循环

      for(j=1; j!=i && j<n; j++)
      

      j == i 时立即停止所有迭代。例如对于 i = 1 和 j = 1,循环将被完全跳过。

      【讨论】:

      • 感谢开箱即用的解决方案。
      • 是的,更加难以辨认和维护...... (void) 演员也是不必要的。恭喜!
      • @LuisColorado void cast 允许转义编译器认为是错误的警告。
      • @VladfromMoscow,void 演员表只会让lint 发表评论,如果您忽略结果值,编译器将不符合要求。这来自 K&R C,并且不会被淘汰。大多数遗留函数确实返回了一些东西(最重要的例子是printf(3) 函数)我看到只有在过度似乎不知道编译器不会遵守的迂腐程序员中。跨度>
      • @LuisColorado gcc 在 www.ideone.com 发出错误。
      【解决方案3】:

      错误是您指定了j!=i,因此您的内部循环将在遇到j 不等于i 的条件时立即退出,并且不会继续获取更多值。

      您只想在i == j 时跳过迭代,您应该使用continue 语句。

      for(i = 0; i < n; i++)
      { 
          for( j = 0; j < n; j++)
          {
              if(i==j) continue;
              printf("%d,%d", i,j)
          }
      }
      

      【讨论】:

        【解决方案4】:

        这里的错误是您不应该将 i!=j 条件评估为您的 for 循环条件,因为这将导致循环终止。该条件需要在循环内作为单独的条件进行检查。您可以使用 if 语句来实现这一点。

        for(i = 1; i < n; i++){
            for(j = 1; j < n; j++){
                if(i != j)
                    printf("%d,%d", i, j);
                }
            }
        

        【讨论】:

        • 这是一个不寻常的、非传统的、独特的indentation style。请使用一种传统的 C 风格——要么是 Allman(我使用的是这种风格),要么是 1TBS 的变体之一。
        【解决方案5】:

        如果j!=i 是条件的一部分,则循环将终止。您想在循环中检查它并在之后继续循环。由于当 i 和 j 相等时条件为假,所以它不会对该迭代执行任何操作并继续进行下一次迭代。

        如果您想包含n 本身,您似乎还想要&lt;= 而不仅仅是&lt;

        int n = 4;
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (i != j)
                {
                    printf("%d,%d ", i, j);
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          您想在 i == j 时跳过循环,但您的代码停止了循环,

          for(i=1;i<n;i++)
          {
              for(j=1; j<n; j++)
              {
                  if( i != j )
                     printf(“%d,%d”,i,j);
             }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-04-06
            • 2016-10-18
            • 2014-11-25
            • 1970-01-01
            • 1970-01-01
            • 2017-01-06
            • 1970-01-01
            相关资源
            最近更新 更多