题解 | #圣诞树#
圣诞树
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; }