代码之家  ›  专栏  ›  技术社区  ›  Jonathan Komar

金字塔胡说八道:如何用代数方法排除I=0,而不是用if条件语句?

  •  -2
  • Jonathan Komar  · 技术社区  · 7 年前

    我制作了这个:

    ---------------------
    *-------------------*
    **-----------------**
    ***---------------***
    ****-------------****
    *****-----------*****
    ******---------******
    *******-------*******
    ********-----********
    *********---*********
    **********-**********
    *********---*********
    ********-----********
    *******-------*******
    ******---------******
    *****-----------*****
    ****-------------****
    ***---------------***
    **-----------------**
    *-------------------*
    

    但我对第一行不满意。我想排除它,所以我制作了一个新的,在for循环周围使用if条件包装来排除I=0。我想知道是否有人知道更干净的解决方案。(仅供参考,这是一个测试题,我的解决方案非常草率。我正在为此练习更简洁的方法(愚蠢的金字塔编程)。

    密码

    看一下评论 // I want to exclude i=0 by using algebra in the for loop . 有人有想法吗?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
      
      /* Pyramid Size */
      int n = 10;
      
      /* Take care of the top */
      for (int i=0;i<n;i++) {
        for (int j=0;j<i;j++)
          printf("*");
        if (i != 0) { // I want to exclude i=0 by using algebra in the for loop
          for (int j=0;j<=n*2-i*2;j++) {
            printf("-");
          }
        }
        for (int j=0;j<i;j++)
          printf("*");
        printf("\n");
      }
      
      /* Take care of the bottom */
      for (int i=n;i>0;i--) {
        for (int j=0;j<i;j++)
          printf("*");
        for (int j=0;j<=n*2-i*2;j++) {
          printf("-");
        }
        for (int j=0;j<i;j++)
          printf("*");
        printf("\n");
      }
    }
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   valdo    7 年前

    只需从1而不是0开始循环。或者,替换 < 通过 <= 在循环中 j .

    还要注意的是,在中间你的星星没有完全相遇,它们之间仍然有差距。这是故意的行为吗?

    我想你可能会想,为什么这个“把戏”只在一开始就需要,而在你的现代艺术画的底部却没有空行。这种类型的“奇迹”被一个错误所抵消。您应该仔细检查代码的边界情况,看看它是否按设计执行。

        2
  •  1
  •   Adam Trhon    7 年前

    你能开始吗 i 从1开始?

    /* Take care of the top */
    for (int i=1;i<n;i++) {