题解 | #圣诞树#

#include <stdio.h>

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        // 树体
        // 树体由n层组成,每一层完成i + 1个小树的打印
        for (int i = 0; i < n; i++) {
            // n = 1 -> 树体第一层第一行前导有2个空格
            // n = 2 -> 树体第一层第一行前导有5个空格
            // n = 3 -> 树体第一层第一行前导有8个空格
            // 第一层第一行 i = 0
            // 第n层第一行前导空格数 = (3 * n) - 1 => (3 * n) - 1 - (3 * i)

            // n = 1 -> 树体第二层第一行前导有0个空格
            // n = 2 -> 树体第二层第一行前导有4个空格
            // n = 3 -> 树体第二层第一行前导有5个空格
            // 第二层第一行 i = 1
            // 第n层第二行前导空格数 = (3 * n) - 1 - 1 => (3 * n) - 1 - (3 * i)

            int space = (3 * n) - 1 - (3 * i);
            // 第一行空格数
            for (int j = 0; j < space; j++) {
                printf(" ");
            }
            // 第一行星号
            for (int k = 0; k <= i; k++) {
                printf("*     ");
            }
            printf("\n");

            // 第二行空格数
            for (int j = 0; j < space - 1; j++) {
                printf(" ");
            }
            // 第二行星号;第二行星号打印应重复i + 1次
            for (int k = 0; k <= i; k++) {
                printf("* *   ");
            }
            printf("\n");

            // 第三行空格数
            for (int j = 0; j < space - 2; j++) {
                printf(" ");
            }
            // 第三行星号
            for (int k = 0; k <= i; k++) {
                printf("* * * ");
            }
            printf("\n");
        }
        // 树干
        // 树干 -> n行
        for (int i = 0; i < n; i++) {
            // 前导空格:
            // n = 1 -> 2个空格
            // n = 2 -> 5个空格
            // n = 3 -> 8个空格
            // 树干前导空格数 = 3 * n - 1
            for (int j = 0; j < 3 * n - 1; j++) {
                printf(" ");
            }
            // 星号:
            // 无论n取什么值,总为1;输出一个*后直接换行
            printf("*\n");
        }


    }
    return 0;
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务