题解 | #圣诞树#

#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;
}
全部评论

相关推荐

09-27 00:29
东北大学 Java
伟大的麻辣烫:查看图片
阿里巴巴稳定性 75人发布 投递阿里巴巴等公司10个岗位
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务