题目1
分析
1. 要打印这个圣诞树,无非就是打印树干与树冠这两个部分。 2. 要打印树干会发现非常容易,经过观察很容易发现规律。可以通过循环实现,每次循环的时候先打印若干个空格,再紧接着打印一个星号即可。 3. 令人头疼的是这个树冠该怎么打印?这其实事实上相当于是在找规律。首先可以肯定的一点就是:肯定是得一行一行这么打印,那也就是说,肯定得是以循环的方式,树冠有多少行,那就意味着要循环多少次。 4. 然后打印树冠的每一行的时候(就是单次循环),首先先打印空格,打印空格的个数也是有规律可循,这个不难。 5. 最为核心的问题在于这个星号的排列该怎么样子打印出来,这时候我想到了一个办法:不把单个星号看成一个整体,而是把六个字符合起来,看成一个整体。具体意义如下图
6. 这样子你会发现,第1.4.7...行的整体都是一样的,第2.6.8...行的整体都是一样的,第3.7. 9...行的整体都是一样的,因此可以得知,这个整体无非就是这三种样子,并且每一行用哪个整体的形式你去那一行是第几行决定。 7. 接下来要考虑的就是,在每一行的打印当中,那个整体到底要打印几次,这个也是很容易找到规律的。至此,树冠的规律已经被摸清楚了。
具体代码实现
#include
int main()
{
int h = 0;
scanf("%d",&h);
//打印树冠
int i = 0;
int j = 0;
for (i = 0; i < 3 * h; i++)
{
//打印空格
for (j = 0; j < (3 * h - (i + 1)); j++)
{
printf(" ");
}
//打印星号整体
int k = i / 3 + 1;//计算循环"整体"的次数
if (i % 3 == 0)
{
for (j = 0; j < k; j++)
{
printf("* ");
}
}
else if (i % 3 == 1)
{
for (j = 0; j < k; j++)
{
printf("* * ");
}
}
else
{
for (j = 0; j < k; j++)
{
printf("* * * ");
}
}
printf("\n");
}
//打印树干
for (i = 0; i < h; i++)
{
for (j = 0; j < (3 * h - 1); j++)
{
printf(" ");
}
printf("*\n");
}
return 0;
}
经验总结
这种打印图形的题目,事实上其实就是根据平面图形找规律,一旦规律被发现,那么用计算机语言实现起来会很容易
|