当前位置:网站首页>【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印
【圣诞节给爱的人打印一颗圣诞树吧】超详细代码实现——圣诞树打印
2022-08-03 05:11:00 【tt142】
上面是圣诞树的大致形状
用代码实现出来是这样的
该想法的来源是牛客网的一道题目
当然只要爱足够多
你的圣诞树(爱)可以溢出屏幕,哈哈
那么我们以
为例子,也就对应题目里的h=2来详细讲解
首先我们注意到,h最大可以取到100,也就是这么庞大的圣诞树一定要用循环+找规律实现
我的第一反应 是数组,先从一小颗圣诞树实现
但是显然这个问题的特点在于空格的打印,而用数组初始化之后打印“你就慢了”
之所以特点在空格
是我们发现h=1的时候除去底部的树干,整个树枝是对称的
*注:
h=1(如图),我们称这个最基本的单元(不包含树干)为小圣诞树
我们完全可以从每一层(一共三层)把树枝分成 一堆空格+*的安排 两部分
那么我们首先实现空格这个问题
现在观察h=2,因为只有一个小圣诞树(h=1)是发现不了当层数变多时候的规律的
注意到 当图片中j=1时 也就是小圣诞树第一层,前面应该有5个空格
和j=4时的小圣诞树的第一层,中间隔了3个格子,也就是 如果设置一个变量,用他表示小圣诞树第一层的空格数,每次循环之后应该+=3
但是换个角度思考,可以让他每次++,但条件是0< <3*h-j 或者是从1开始到3*h-j+1
(这里比较抽象,需要带入h=2,好好想一下逻辑)
为什么不采用+=3的方法,因为这样知识分析了第一层的空格情况,但是用0~3*h-j就完美解决了小圣诞树1~3层的所有空格问题
剩下的就是*的安排
这个部分是根据每一层的不同特点具体安排的,绝对不能向空格一样一概而论
基于上述的+=3思想
由于我们从图片列数是1开始分析的,而不是从上至下,所以是-=3
所以代码如下
//打印圣诞树
int main()
{
int h = 0;
scanf("%d", &h);
for (int j = 1; j <= 3 * h; j++)
{
for (int m = 0; m < 3 * h-j; m++)
printf(" "); //全局空格的打印,和后面所有打印空格的代码二选一
if (j % 3 == 1)
{
// for (int m = j; m < 3 * h; m++)
// printf(" "); //一个空格
for (int p = j; p > 0; p -= 3)
printf("* "); //5个空格
printf("\n");
}
if (j % 3 == 2)
{
// for (int c = j; c < 3 * h; c++)
// printf(" "); //一个空格
for (int p = j; p > 0; p -= 3)
printf("* * "); //三个空格
printf("\n");
}
if (j % 3 == 0)
{
// for (int m = j; m < 3 * h; m++)
// printf(" ");
for (int c = j; c > 0; c -= 3)
printf("* * * "); //末尾一个空格,相邻之间一个
printf("\n");
}
}
for (int l = 1; l <= h; l++)
{
for (int c = 1; c <= 3* h +1; c++)
{
if (c == 3 * h)
printf("*");
else
printf(" "); //一个空格
}
printf("\n");
}
}
方法不唯一,但是个人以为这样比较容易思考和实现
创作不易,感谢观看
边栏推荐
猜你喜欢
随机推荐
建造者模式(Builder Pattern)
Shell conditional statement judgment
力扣561. 数组拆分
Lambda表达式案例
Pr第四次培训笔记
1060 爱丁顿数 (25 分)
Makefile介绍
设计模式——组合模式、享元模式(Integer缓存)(结构型模式)
idea uses @Autowired annotation to explain the reasons and solutions
高可用 两地三中心
JS学习笔记(三)
Djiango第三次培训
背压机制
数据分析 第一篇
1.ROS环境搭建与基础工作
-角谷猜想-
阿凡提的难题
Odps temporary query can write SQL, turned out to a named?
web安全-命令执行漏洞
idea使用@Autowired注解爆红原因及解决方法