本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。

输入格式:
输入在一行中给出一个正的奇数n。

输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。

输入样例:

1
7

输出样例:

1
2
3
4
5
6
7
      * 
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

评价:
卧槽……这玩意真的写的我脑汁都快没了,看了其他大神写的感觉自己写的还是不那么美,但总归是写出来了,以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
int main() {
int n;
if (scanf("%d", &n)) {};
for (int i = 1,b = n-1; i <= (n / 2) + 1; i++,b -= 2) {
for (int m = 1; m <= b; m++) {
printf(" ");
}
for (int t = 1; t <= 2 * i - 1; t++) {
printf("* ");
}
printf("\n");
}
for (int i = 1,b = 0,a = n; i <= n / 2 + 1; i++,b += 2,a -= 2) {
if (i != 1) {
for (int m = 1; m <= b; m++) {
printf(" ");
}
for (int t = 1; t <= a; t++) {
printf("* ");
}
printf("\n");
}
}
return 0;
}


简单分析下原理,我这边的实现方式是,先尝试输出半个菱形,再修改算法让他倒着输出,然后通过if不输出中间那一行;这是整体的原理。
下面说以下局部的原理,对于每一行,他实质上是这样组成的:“一堆空格”+若干个“ ”(注意后面是有空格的)
而为了让他形成类似菱形的排布,我们可以通过观察示例中给的7行菱形看到以下规律:
我们只看上半部分的情况下,也就是1~4行:
1.每一行的空格到中间空格数量递减顺序为: 6、4、2、0
2.每一行的到中间的的数量递增顺序为:1、3、5、7
于是我们就安排循环嵌套循环就大致实现了半个菱形的输出。