本題要求編寫程式,列印一個高度爲n的、由「*」組成的正菱形圖案。
輸入格式:
輸入在一行中給出一個正的奇數n。
輸出格式:
輸出由n行星號「*」組成的菱形,如樣例所示。每個星號後跟一個空格。
輸入樣例:
7
輸出樣例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
評價:
臥槽……這玩意真的寫的我腦汁都快沒了,看了其他大神寫的感覺自己寫的還是不那麼美,但總歸是寫出來了,以下是程式碼:
#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
於是我們就安排回圈巢狀回圈就大致實現了半個菱形的輸出。