N-39. 没有圣诞树的圣诞夜
因为疫情,David没有出门购买圣诞节所需要的圣诞树,心里感觉空落落的。请你用程序给他绘制一个圣诞树,满足他的心愿。绘制规则如下:
1.输入的正整数n为总行数;
2.每三行一组,最后剩下的1~3行绘制树干,整体居中;
3.每一组(以第i组为例,i从1开始)第一行打印3个’’,第二行打印3+4i个’’,第三行打印3+8i个’*’;
4.树干的那几行每行3个’*’。
简单的图形打印问题,我们需要处理的点有:组数与树干行数, 如何居中。
#include <stdio.h>
#include <string.h>
int main () {
int n;
scanf("%d" , &n);
int p = n % 3 ? n / 3 : n / 3 - 1, q = n % 3 ? n % 3 : 3; // p组数,q树干行数
int max = 3 + 8 * p; // 总长度
for (int i = 1; i <= p; i++) {
for (int j = 1; j <= (max - 3) / 2; j++) printf(" ");
for (int j = 1; j <= 3; j++)printf("*");
printf("\n"); // 第一行
for (int j = 1; j <= (max - 3 - 4 * i) / 2; j++) printf(" ");
for (int j = 1; j <= 3 + 4 * i; j++)printf("*");
printf("\n"); // 第二行
for (int j = 1; j <= (max - 3 - 8 * i) / 2; j++) printf(" ");
for (int j = 1; j <= 3 + 8 * i; j++)printf("*");
printf("\n"); // 第三行
}
for (int i = 1; i <= q; i++) {
for (int j = 1; j <= (max - 3) / 2; j++) printf(" ");
for (int j = 1; j <= 3; j++)printf("*");
printf("\n"); // 树干(和每组第一行一样)
}
return 0;
}