編碼輸出圖形的思想:最重要的不是怎麼敲,而是怎麼想!(楊輝三角和輸出金字塔!)
阿新 • • 發佈:2018-12-11
我們在程式設計練習初始階段總會碰到這樣的演算法題,輸出一個怎樣怎樣的圖形,達到什麼樣的效果,其實這樣的題都會有一個固定的思想。
首先要發現其中隱藏的規律,既然是輸出圖形,怎麼擺放一定是有規律的,要不然各種亂,一點規律沒有,這樣的題就一點意義都沒有了。所以拿到這種演算法題,不是拿過來就敲程式碼,要根據觀察得來的規律,腦中大致要有一個思路,第一步實現什麼,第二步實現什麼,這是很重要的,同時這也是很多初學者程式設計時候最容易犯的錯誤!
下面我們用楊輝三角形和金字塔來進行舉例:
-
楊輝三角形
- 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1
- 大家可以自己畫一下觀察一下規律(有人問為啥不是等腰三角形形狀?那個輸出的時候控制一下就好了!)
- 首先,最明顯的是最外層全是1;
- 之後呢,從第三行開始每一個數是上一行本列和前一列的的數之和,不過此時要注意就是第一列和最後一列除外。
- 此時,大家再觀察一下,還有沒有其它的規律呢?
- 沒有的話,此時還不是直接敲程式碼哦,別心急,想一下如何是實現?這對初學者尤為重要,思路清晰事半功倍!
- 程式設計開始的第一步,你一定是要把最外層的1放進去的,因為這是最明顯的。那麼放在哪裡?觀察這個楊輝三角,每個數其實就像在一個棋盤上面,每個都對齊著,有行有列,那我們就可以用一個二維陣列來儲存每個資料。
- 第二步:此時最外層1放進去了,便可以實現第二哥規律了:從第三行開始每一個數是上一行本列和前一列的的數之和,此時陣列正好可以用下標來表示行和列。
- 第二步完成時,規律實現完,也就是把所有數按照規律放在了裡面。
- 最後一步,列印輸出。
import java.util.Scanner; public class c { public static void main(String[] args) { System.out.println("請輸入所要顯示楊輝三角的行數:"); Scanner in = new Scanner(System.in); int Line = Integer.parseInt(in.nextLine()); int[][] arr = new int[Line][Line]; for(int i = 0; i < arr.length; i++){ arr[i][0] = 1; arr[i][i] = 1; } for(int i = 2; i < arr.length; i++){ for(int j = 1; j <= i-1 ; j++){ arr[i][j] = arr[i-1][j-1] + arr[i-1][j]; } } for(int i = 0; i < arr.length ; i++){ for(int j = 0; j <= i ; j++){ System.out.print(arr[i][j]+" "); } System.out.println(); } } }
-
金字塔
- (我是直接擷取的圖片,大家可以畫一下,這樣有助於大家瞭解這道題。 )
- 大家先畫一下這個三角形金子塔,根據上面的楊輝三角,來做一下道圖形輸出題。
- 同樣,首先第一步不是直接敲程式碼,而是找出隱藏規律!!!
- 第一步,觀察出最明顯的,也就是星號了吧。繼續觀察每一行的星號,此時相信你已經不難發現星號與行數的關係!恭喜你,第一個規律就找到了。
- 第二步,整個金字塔除了這些還有啥?沒啥了啊,是不是?不是的,那不還有空格嘛?要不然你怎麼將星號放在中間的位置啊?繼續觀察每一行的空格,此時你就不難發現空格和行數的關係!
- 此時整個金字塔分析完畢,整理可得:
- 空格:等於 行數減一
- 星號:等於 2倍 行數減一
- 此時還不是直接敲程式碼哦,別心急,想一下如何是實現?
- 很明顯,輸出的時候一定是先輸出空格,之後再輸出星號,對吧,要不然怎麼可能讓星號直接放到中間。
- 輸出空格、星號之後第一行就結束了,第二行同樣,第三行也同樣...不知道你有沒有感覺但,如此有規律我們是不是就可以想到用for迴圈啦。一定是先限制行數,再限制空格,最後再限制星號!
- 想到這,就可以行動啦!
-
import java.util.Scanner; public class ptOne { public static void main(String[] args) { System.out.println("請輸入要列印的金字塔行號:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); for(int i = 1;i <= Line; i++){ // 控制行數 //先輸出空格 for(int j = 0; j < Line-i;j++){ //控制空格 System.out.print(" "); } //在輸出星號 for(int t = 0; t < 2*i-1; t++){ //控制星號 System.out.print("*"); } System.out. } System.out.println(); } } }
到這,你是不是已經明白了呢?不妨自己編一下倒三角和菱形來檢測一下自己吧!! 要記住:一定要多敲程式碼,而不是看懂了就ok了哦!
//倒三角 import java.util.Scanner; public class b { public static void main(String[] args) { System.out.println("請輸入要列印的金字塔行號:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); //行數 for(int i = Line; i > 0; i--){ for(int j = 0; j < Line - i ;j++){ System.out.print(" "); } for(int t = 0;t <2*i-1;t++){ System.out.print("*"); } System.out.println(); } } } //菱形 import java.util.Scanner; public class b { public static void main(String[] args) { System.out.println("請輸入要列印的金字塔行號:"); Scanner in = new Scanner(System.in); int Line = in.nextInt(); for(int i = 1;i <= Line; i++){ for(int j = 0; j < Line-i;j++){ System.out.print(" "); } for(int t = 0; t < 2*i-1; t++){ System.out.print("*"); } System.out.println(" "); } //行數 for(int i = Line; i > 0; i--){ for(int j = 0; j < Line - i ;j++){ System.out.print(" "); } for(int t = 0;t <2*i-1;t++){ System.out.print("*"); } System.out.println(); } } }