首頁歷史 > 正文

星號稜形,數字稜形及其他對稱圖形的分析方法

2022-03-21由 沒畢業的程式設計師 發表于 歷史

星號稜形,數字稜形及其他對稱圖形的分析方法

這一類圖形其實都可以運用其對稱性進行分析,選定中心圖案或數字,進行規律分析來實現的。

1。 先來一道簡單的題。

輸入一個整數n,輸出n行n列的“ * ”號,程式碼如下

//比較簡單,直接上兩個for迴圈就行了。#include int main(){ int i,n,k; scanf(“%d”,&n); for(i=0;i

星號稜形,數字稜形及其他對稱圖形的分析方法

2。輸出入下圖所示的稜形。

* ******** *** *

星號稜形,數字稜形及其他對稱圖形的分析方法

我們只需要輸出以上稜形就行了,透過觀察,稜形一共有5行,我們可以用5個printf()函式進行輸出。但是,用這種方式難免太機械化了,如果要輸出100行,很明顯這種方法行不通,還有沒有其他方法呢?

3。

Description由鍵盤輸入正數n(n<30),要求輸出如下2*n+1行的菱形圖案。輸出格式菱形右邊不留多餘空格輸入樣例2輸出樣例 * ******** *** *

星號稜形,數字稜形及其他對稱圖形的分析方法

這道題用printf()函式輸出根本不可能了,很容易地,我們想到了應該用迴圈來解決問題。

先把這個稜形分成上下兩部分,設定一個外層迴圈控制行,再使用內層迴圈列印空格及*號。

*

***

*****

***

*

(紅色為上半部分,綠色為下半部分,透過每部分的規律來實現。因為分上下部分,所以就需要兩個for迴圈)

#include int main(){ int n,i,k,j; scanf(“%d”,&n); for(i=1,k=1;i<=n+1;i++) { for(j=1;j<=n-i+1;j++) { printf(“ ”); //列印空格 } for(j=1;j<=k;j++) { printf(“*”); //列印*號 } printf(“\n”); k+=2; } for(i=1,k=2*n-1;i<=n;i++) { for(j=1;j<=i;j++) { printf(“ ”); //列印空格 } for(j=1;j<=k;j++) { printf(“*”); //列印*號 } printf(“\n”); k-=2; } return 0;}

星號稜形,數字稜形及其他對稱圖形的分析方法

我們發現,凡是這些圖形,都可以把他們分成若干分,一個個地來實現。

還有沒有更好的辦法呢?

不難發現,稜形是一個上下呈對稱的圖形,還可以利用對稱性來更好的解決問題。

題目要求輸出的行數是2*n+1行,是奇數,因此,還可以用相反數來控制行數。

#include “stdio。h”int main(){ int n,i,j; scanf(“%d”,&n); for(i=-n;i<=n;i++) //一共要列印2*n+1行,從-n到n。 { for(j=1;j<=abs(i);j++) printf(“ ”); for(j=1;j<=2*n+1-2*abs(i);j++) printf(“*”); printf(“\n”); } return 0;}

星號稜形,數字稜形及其他對稱圖形的分析方法

程式碼量是不是瞬間就減少了好多。

下面我們來一步步進行分析!

1。) 首先,稜形是一個上下左右對稱的圖形,肯定存在某種數學規律。

2。) 其次,設定絕對值就是利用了對稱性。

3。)以當n=2為例。(以——-代替空格)

——

* 空格數:2 *號數:1

-

*** 空格數:1 *號數:3

***** 空格數:0 *號數:5 ---------->

以上下對稱軸處為中心行,在列印*號時用相應行數的絕對值的四則運算來

-

*** 空格數:1 *號數:3

進行計算要列印多少*號

——

* 空格數:2 *號數:1

好了,我們透過選定了中心行很容易地列印了*號稜形。

既然我們利用了上下對稱的規律,有沒有可以利用左右對稱呢?

4。

列印星號空心菱形 描述由鍵盤輸入n(n為奇數),列印如下圖空心菱形例n=7 * * * * ** * * * * * *輸入格式奇正整數輸入樣例3輸出樣例 ** * *

星號稜形,數字稜形及其他對稱圖形的分析方法

當然,這道題也可以把它分成若干分,一個個來實現。(程式碼如下)

#include int main(void){ int i,j,n; scanf(“%d”,&n); for(i=1;i<=(n+1)/2;i++) { for(j=1;j<=(n+1-2*i)/2;j++) { printf(“ ”); } printf(“*”); if(i==1) { printf(“\n”); } else { for(j=1;j<=2*i-3;j++) { printf(“ ”); } printf(“*\n”); } } for(i=1;i<=(n-1)/2;i++) { for(j=1;j<=i;j++) { printf(“ ”); } printf(“*”); for(j=1;j<=n-2*i-2;j++) { printf(“ ”); } if(i<=(n-3)/2) { printf(“*\n”); } } return 0; }

星號稜形,數字稜形及其他對稱圖形的分析方法

超級長,而且裡面的數學表示式要算很久。

若採用對稱的方法:(程式碼如下)

#include int main(void){ int i,j,n; scanf(“%d”,&n); n=(n-1)/2; for(i=-n;i<=n;i++) { for(j=1;j<=2*n+1-abs(i);j++) { if(j==abs(i)+1||j==2*n+1-abs(i)) printf(“*”); else printf(“ ”); } printf(“\n”); } return 0; }

星號稜形,數字稜形及其他對稱圖形的分析方法

採用了上下左右對稱的方法,並且運用數學公式,符合規律的列印輸出相應的空格或*號。

以n=7為例分析:

* * * * ** * * * * * *

星號稜形,數字稜形及其他對稱圖形的分析方法

在程式碼中,第二個for迴圈用來控制一行需要輸出的字元數,這裡的字元是空格和*號。

還是選定上下對稱軸的那行作中心行。

一行處除特殊外都要輸出兩個*號,排除特殊性來分析。

然後在if語句中,很容易發現第一個判斷“j==abs(i)+1”的規律,

第二個判斷語句是以中心行最右邊的*號為基點縮回的。

頂部