【解析】習題4-9 列印菱形圖案 | C語言實現 | PTA

2020-08-14 01:04:39

本題要求編寫程式,列印一個高度爲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
於是我們就安排回圈巢狀回圈就大致實現了半個菱形的輸出。