C - 需要帮助评估打印由 # 和空格组成的金字塔的代码的效率

问题描述 投票:0回答:1

哈佛 CS50x 课程中的一个问题需要输入 1 到 8 之间的高度。有了这个高度,输出应该打印一个由空格和 # 组成的金字塔。

example pyramid

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int height = 0;
    do
    {
        // prompt for pos int between 1-8
        height = get_int("Height? ");
    }
    while (height < 1 || height > 8);

    for (int row = 0; row < height; row++)
    {
        // print left spaces
        for (int j = height - row; j > 1; j--)
        {
            printf(" ");
        }

        // print left #
        for (int i = row; i >= 0; i--)
        {
            printf("#");
        }

        // print gap
        printf("  ");

        // print right #
        for (int z = row; z >= 0; z--)
        {
            printf("#");
        }

        // print new line
        printf("\n");
    }
}

我通过了所有测试用例,但我想知道是否有办法使用更少的代码行来解决这个问题。

c cs50
1个回答
0
投票

以下代码打印一堆字符:

for (int z = row; z >= 0; z--)
{
    printf("#");
}

您可以通过巧妙地索引字符串来使用单个

printf
调用来完成此操作:

printf("##########" + 10 - (row + 1));

这里

"##########" + 10
是一个超过字符串末尾的指针;从中减去一个数字将得到一个包含该数量字符的字符串。


您可以使用

puts
来执行此操作,而不是显式打印行尾字符。但不确定这算不算简化,因为你不能在任何地方都这样做——这只是一个有趣的事实。


您可以通过滥用

printf
的“字段宽度”功能来输出任意数量的空格(但不能输出其他字符 - 这个想法仅适用于空格)。例如,以下命令将在 10 个字符的字段中打印一个 4 个字符的字符串,并有效地在其前面添加 6 个空格:

printf("%*s", 10, "####");

这会让你的代码变得更复杂一些,但是更短。不确定综合效果是否有所改善。无论如何,如果你使用了这样的技巧,你必须在评论中解释它们。

© www.soinside.com 2019 - 2024. All rights reserved.