圣诞树问题(牛客网114原题)解法,思考大全

文章详细介绍了如何解决牛客网上一道中等难度的编程题目——圣诞树。作者通过分析示例,将问题分解为打印上半部分的三角形和树干,重点讲解了利用变量优化空格和星号打印的逻辑,强调了解题过程中画图的重要性。并提供了完整的C语言代码实现。
摘要由CSDN通过智能技术生成

前言

在牛客网的基础语法练习中几乎所有的题目都是入门和简单的题目,只有两道题是中等难度的,其中一道就是这篇文章所要提到的——圣诞树,这个题目在各大网站上几乎都没怎么提到,有的也仅仅只有代码(我刚开始写的时候也是非常的痛苦,自己一个人看代码实在是看的很头痛),接下让我们进入这道题目。

圣诞树

1.题目

在这里插入图片描述
这道题的链接我也会放在评论区。

2.示例

在这里插入图片描述

3.分析

在做这道题目的时候我们最关键的一步就是找好分析的例子,这里我选择的是第二个示例,相比于3它形状还是较为简单的,相比于1它更具有一般性。
在这里插入图片描述

这里我们通过和示例一的对比,我们可以把这个图像分为1,2两个部分(红色的部分),上半部分就是3个三角形,下面就是树干,当然树干的部分是比较容易可以想出的,这道题的难点也就在于上半部分的代码
对于上半部分我们单独拿出来再分成1,2两个部分(也就是用蓝色框框的部分)。现在,题目开始变的明了了起来,我们接下来要进行的就是打印出第一个三角形,先打印空格再打印号,当然我们还是要画图进行观察。
在这里插入图片描述
对于第一行,先打印五个空格,在打印
号,第二行4个,第三行三个,这道题目最巧妙的地方在于我们设置一个变量 int d=3*n那么这里的空格就表示成了d-1,d-2,d-3;这里我们再来观察下半部分,下半部分的三角形中最让人压抑的部分在于他中间的空格,所以我们再打印三角形三行的时候我们就要注意这一点,printf("* "); printf("* * "); printf("* * * ");
我们观察中间空格的个数,写出上面三种代码,解决了中间空格下半部分的*号`前面的空格怎么办呢?刚刚说到一个非常巧妙的变量d下面的空格是2,1那么我们就让b-=3就完美的解决了问题。
当然最后树干部分的打印这里也不多说了,代码一目了然。

4.代码

上面题目的分析我也在下面代码的实现中做了一些注意方便大家理解


```c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() 
{
    int n=0;
    int c = 1;
    while ((scanf("%d", &n)) != EOF)
    {
        int d = 3 * n;
        for (int i = 0; i < n; i++)
        {
            //打印第一行
            for (int j = 0; j < d - 1; j++)//先打印空格
            {
                printf(" ");
            }
            for (int k = 0; k <= i; k++)//在打印*
            {
                printf("*     ");
            }
            printf("\n");
            //打印第二行
            for (int j = 0; j < d - 2; j++)//先打印空格
            {
                printf(" ");
            }
            for (int k = 0; k <=i; k++)//在打印*
            {
                printf("* *   ");
            }
            printf("\n");
            //打印第三行
            for (int j = 0; j < d - 3; j++)//先打印空格
            {
                printf(" ");
            }
            for (int k = 0; k <= i; k++)//在打印*
            {
                printf("* * * ");
            }
            printf("\n");
            d -= 3;
        }
        //树干部分打印
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < 3 * n - 1; j++)
            {
                printf(" ");
            }
            printf("*\n");
        }
    }
    return 0;
}

## 5.结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c375185802248fdbfeb89b059c08e5d.png)
## 6.总结
这个题目和上一篇文章讲的图形问题不太一样,这个更为进阶,但是所有打印图形的题目都有一个非常重要的解题步骤就是**画图!画图!画图!**画图可以非常方便我们去理解。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tpoog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值