如何在C中打印此模式?

时间:2015-10-02 07:48:13

标签: c for-loop

我必须打印这个:

          0          
        1 0 1        
      2 1 0 1 2      
    3 2 1 0 1 2 3    
  4 3 2 1 0 1 2 3 4  
5 4 3 2 1 0 1 2 3 4 5

我的代码:

#include<stdio.h>
    int main()
    {
        int i,j,k,l;

        for(i=1;i<=6;i++)
        {
            for(j=6;j>i;j--)
            {
                printf(" ");
            }

            for(k=i-1;k>=0;k--)
            {
                printf("%d",k);
            }

            for(l=1;l<i;l++)
                printf("%d",l);
            printf("\n");
        }
        return 0;
    }

我的输出:

     0          
    101        
   21012      
  3210123    
 432101234  
54321012345

我刚刚开始用C编码,所以这对我来说是新的。如何在数字之间放置空格,以使最终输出看起来比现在更优雅?

我在%-6d中尝试printf("%d",k);调整宽度,但输出的缩进错误。

3 个答案:

答案 0 :(得分:5)

这很容易解决。您当前打印一个字符(除换行符之外)的任何地方,只需打印该字符后跟一个空格。

如果你这样做,你会看到你想要的输出:

          0 
        1 0 1 
      2 1 0 1 2 
    3 2 1 0 1 2 3 
  4 3 2 1 0 1 2 3 4 
5 4 3 2 1 0 1 2 3 4 5 

我不会向你展示代码,因为它几乎肯定是课堂作业,如果你自己坚持下去,你会成为一个更好的编码器。但我给你一个有三行需要改变的小窍门。这应该更多足以解决问题。

  

作为旁注,这将在最后一位数后的每行末尾打印一个空格。如果不允许这样做,有办法解决它,主要是通过更改最后一个循环,这样就不会为该行的最终项目输出空间。

     

如果你开始尝试使用两位数字,它也将开始失败。要解决这个问题,您需要知道最宽的数字,并使用宽度为printf的字段说明符。但是,由于它不在原始规范中,我没有实现(见YAGNI)。

如果你想实现类似的东西(在行尾有较大的数字和删除的空格),你可以使用类似的东西:

#include<stdio.h>

#define COUNT 15

int main(void) {
    // Sanity check.

    if (COUNT < 1) return 0;

    // Get maximum width.

    int width = 1, value = COUNT;
    while (value > 9) {
        value /= 10;
        width++;
    }

    // For each line.

    for (int line = 1; line <= COUNT; line++) {
        // Output leading spaces.

        for (int column = COUNT; column > line; column--)
            printf("%*s ", width, "");

        // Output descending digits.

        for (int column = line - 1; column >= 0; column--)
            printf("%*d ", width, column);

        // Output ascending digits.

        for (int column = 1; column < line; column++) {
            printf("%*d", width, column);
            if (column < line - 1) putchar(' ');
        }

        // Finish off line.

        putchar('\n');
    }

    return 0;
}

它具有以下优点:

  • 它允许可变宽度。
  • 它使用更合适的命名(和更少)循环变量。
  • 它不会输出每行末尾的空格。

如果这个的课堂作业,请不要按原样使用它,你几乎肯定会被发现。

答案 1 :(得分:1)

用这个.. 在所有三个循环中添加一个空格。

int i, j, k, l;
for (i = 1; i <= 6; i++) {
    for (j = 6; j > i; j--) {
        System.out.printf("  ");
    }
    for (k = i - 1; k >= 0; k--) {
        System.out.printf("%d ", k);
    }
    for (l = 1; l < i; l++) {
        System.out.printf("%d ", l);
    }
    System.out.printf("\n");
}

答案 2 :(得分:-1)

使用printf(“%d”,k)而不是printf(“%d”,k)。