题解 | #圣诞树#
圣诞树
https://www.nowcoder.com/practice/9a03096ed8ab449e9b10b0466de29eb2
/**
* @brief
* @note
* @retval
* 这里的最小单元指的是: *
* * *
* * * *
* 3行6列,6列按照最后一行,最后一个 “*” 后需要加“ ”
*/
#include <stdio.h>
int main() {
int h;
while (scanf("%d", &h) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
for (int i = 0; i < h; i++)
{
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3 * (h - 1 - i) + 6 * (i + 1); k++) // h-1-i表示前面的空列数,6*(i+1)表示最小单元的列数
{
if(j == 0 ){ // 最小单元的第一行
if ((k - 3 * (h - 1 - i)) % 6 == 2){ // 去掉前面空列数,整除为2打印 “*”,否则打印“ ”
printf("*");
}else{
printf(" ");
}
}
if(j == 1){ // 最小单元第二行
if((k - 3 * (h - 1 - i)) % 6 == 1 || (k - 3 * (h - 1 - i)) % 6 == 3){
printf("*");
}else{
printf(" ");
}
}
if(j == 2){ // 最小单元第三行
if(k >= 3*(h - 1 - i) && (k - 3 * (h - 1 - i)) % 6 == 0 || (k - 3 * (h - 1 - i)) % 6 == 2 || (k - 3 * (h - 1 - i)) % 6 == 4){
printf("*"); // 这里的k >= 3*(h-1-i)是为了防止出现第三行异常问题,理论上面的两行也需要判断
}else{
printf(" ");
}
}
}
printf("\n");
}
}
for(int j = 0; j < h; j++){
for (int i = 0; i < 3 * h - 1; i++) // 这里的3h-1其实很好观察出来
{
printf(" ");
}
printf("*\n");
}
}
return 0;
}