星號稜形,數字稜形及其他對稱圖形的分析方法
星號稜形,數字稜形及其他對稱圖形的分析方法
這一類圖形其實都可以運用其對稱性進行分析,選定中心圖案或數字,進行規律分析來實現的。
1。 先來一道簡單的題。
輸入一個整數n,輸出n行n列的“ * ”號,程式碼如下
//比較簡單,直接上兩個for迴圈就行了。#include 2。輸出入下圖所示的稜形。 * ******** *** * 我們只需要輸出以上稜形就行了,透過觀察,稜形一共有5行,我們可以用5個printf()函式進行輸出。但是,用這種方式難免太機械化了,如果要輸出100行,很明顯這種方法行不通,還有沒有其他方法呢? 3。 Description由鍵盤輸入正數n(n<30),要求輸出如下2*n+1行的菱形圖案。輸出格式菱形右邊不留多餘空格輸入樣例2輸出樣例 * ******** *** * 這道題用printf()函式輸出根本不可能了,很容易地,我們想到了應該用迴圈來解決問題。 先把這個稜形分成上下兩部分,設定一個外層迴圈控制行,再使用內層迴圈列印空格及*號。 * *** ***** *** * (紅色為上半部分,綠色為下半部分,透過每部分的規律來實現。因為分上下部分,所以就需要兩個for迴圈) #include 我們發現,凡是這些圖形,都可以把他們分成若干分,一個個地來實現。 還有沒有更好的辦法呢? 不難發現,稜形是一個上下呈對稱的圖形,還可以利用對稱性來更好的解決問題。 題目要求輸出的行數是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 超級長,而且裡面的數學表示式要算很久。 若採用對稱的方法:(程式碼如下) #include 採用了上下左右對稱的方法,並且運用數學公式,符合規律的列印輸出相應的空格或*號。 以n=7為例分析: * * * * ** * * * * * * 在程式碼中,第二個for迴圈用來控制一行需要輸出的字元數,這裡的字元是空格和*號。 還是選定上下對稱軸的那行作中心行。 一行處除特殊外都要輸出兩個*號,排除特殊性來分析。 然後在if語句中,很容易發現第一個判斷“j==abs(i)+1”的規律, 第二個判斷語句是以中心行最右邊的*號為基點縮回的。