圣诞树图案的打印~C语言
- 题目原文:[圣诞树](https://www.nowcoder.com/practice/9a03096ed8ab449e9b10b0466de29eb2?tpId=107&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking&difficulty=&judgeStatus=&tags=&title=&sourceUrl=&gioEnter=menu)
- 题目分析
- 树枝第一步,打印空格。
- 树枝打印第二步:打印图案
- 打印树干第一步,打印空格
- 打印树干第二步,打印图案
- 完整代码
题目原文:圣诞树
题目分析
首先我们把树分为上下两部,树干和树枝。仔细观察树枝我们发现,不管层级n是多少的圣诞树,它们的树枝都是由类似于小金字塔构成的。
例如:层数n == 1,树枝部分有1层,第一场是1个金字塔图案。
n == 2,树枝部分有2层,第一层有1个金字塔,第2层有2个金字塔。
n == 3,树枝部分有3层,第一层有1个,第二层有2个,第三层有3个…
树枝的部分,可以用循环来实现。
树枝第一步,打印空格。
n == 1,打印空白个数d == 2 , 1 , 0
n == 2,d == 2+3, 4 , 3 , 2 , 1 , 0
n == 3,d==2+3+3, 7 , 6 , … 3 , 2 , 1 ,0
规律:d == 3 * n - 1;
即每一层金字塔空白字符的打印都比上一次多3个 。
树枝打印第二步:打印图案
以n == 2为例:
打印第1层金字塔
int d = 3 * n;for (int a = d -1;a>0;a--)//{printf(" ");}for (int k = 1; k <= i; k++)//k代表一行打印多少个“* ”,i其实表示层数{printf("* ");//把第一层当作“* ”来打印,原因是n>1时(举例n==2),第二层//有2个金字塔,它们之间有5个空格。}printf("\n");for (int a = d - 2; a > 0; a--)//同上{printf(" ");}for (int k = 1; k <= i; k++){printf("* * ");}printf("\n");for (int a = d-3; a > 0; a--)//同上{printf(" ");}for (int k = 1; k <= i; k++){printf("* * * ");}printf("\n");
接下来打印第2层,它开头的空格比上一次少3个:即d -= 3;
第2层打印2个金字塔图案,金字塔图案 k和层数 i 成正比例关系。所以用循环来表示。
int main()
{int n = 0;//层数scanf("%d", &n);int d = 3 * n;//a和d用于控制最开始的空白数;for (int i = 1; i <= n; i++)//树枝层数{for (int a = d -1;a>0;a--)//{printf(" ");}for (int k = 1; k <= i; k++) ”{printf("* ");}printf("\n");for (int a = d - 2; a > 0; a--)//同上{printf(" ");}for (int k = 1; k <= i; k++){printf("* * ");}printf("\n");for (int a = d-3; a > 0; a--)//同上{printf(" ");}for (int k = 1; k <= i; k++){printf("* * * ");}printf("\n");d = d - 3;}
}
打印树干第一步,打印空格
层数n == 1,打印空格 d == 2;
n == 2,d == 2 + 3;
n == 3,d == 2 + 3 + 3;
规律 : d == 3 * n - 1;
for (int i = 1; i <= 3 * n - 1; i++){printf(" ");}
打印树干第二步,打印图案
层数 n == 1;打印1行,每行1个
n == 2,打印2行,每行1个
n == 3,打印3行,每行1个
int c = 1;
while (c<=n){for (int i = 1; i <= 3 * n - 1; i++){printf(" ");}printf("*\n");c++;}
完整代码
int main()
{int c = 1;int n = 0;scanf("%d", &n);int d = 3 * n;for (int i = 1; i <= n; i++){for (int a = d -1;a>0;a--){printf(" ");}for (int k = 1; k <= i; k++){printf("* ");}printf("\n");for (int a = d - 2; a > 0; a--){printf(" ");}for (int k = 1; k <= i; k++){printf("* * ");}printf("\n");for (int a = d-3; a > 0; a--){printf(" ");}for (int k = 1; k <= i; k++){printf("* * * ");}printf("\n");d = d - 3;}while (c<=n){for (int i = 1; i <= 3 * n - 1; i++){printf(" ");}printf("*\n");c++;}return 0;
}
如有不足,请大佬们指正。。。