本文首發於微信公衆號:"算法與編程之美",歡迎關注,及時瞭解更多此係列文章。
問題描述
本題目要求你在控制檯輸出一個由數字組成的等腰三角形。
1. 先用1,2,3,...的自然數拼一個足夠長的串
2. 用這個串填充三角形的三條邊。從上方頂點開始,逆時針填充。
比如,當三角形高度是8時:
1
2 1
3 8
4 1
5 7
6 1
7 6
891011121314151
要求:空格一律用"."代替。
輸入格式:
一個正整數n(3<n<300),表示三角形的高度
輸出格式:
用數字填充的等腰三角形。
輸入樣例:
5
輸出樣例:
....1
...2.1
..3...2
.4.....1
567891011
輸入樣例:
10
輸出樣例:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
解決方案
(1)確定三角形拼接的範圍:因爲三角形是一個自然數拼接成的串,所以我們先確定不同層數對應到的自然數,觀察兩個案例(從上到左下到右再到上)可知:5層到13,10層到23(均未到最後一個自然數的最後一個值是因爲第一層只有一個自然數)。所以n層則會從1拼接到2n+3。
(2)每一行第一個數字前的空格數:觀察題目給出的兩個輸出案例可以發現每一行第一個數前面的空格數爲輸出三角形的高(n) - 第幾層。
(3)每一行的第一個數剛好和層數相等。
(4)第2到第n層兩個數之間的空格數:從第二層開始所以有i-2,每一層增加兩個即(i-2)* 2,又因起始數量爲1,所以規律是(i-2)* 2 – 1。
(5)第2到第n層第二個數的確定:因爲從上到下的第二個數字是拼接的串的逆序且第一層只有一個數字,所以第n層的第二個數字爲拼接串的倒數第n個數字。
(6)最後一層即爲拼接串的第n個數到倒數第n個數。
解決代碼
n = int(input()) lis1 = "".join(str(i) for i in range(1, 2 * n + 4)) print("." * (n - 1) + lis1[0]) # 第一層 for i in range(2, n): # 第2到n-1層 print("." * (n - i) + lis1[i-1] + "." * ((i - 2) * 2 + 1) + lis1[-i]) print(lis1[n - 1: -n+1]) # 最後一層 |
運行實例
結語
本題的關鍵在於尋找三角形中存在的多個規律。
主編:歐洋
稿件來源:深度學習與文旅應用實驗室(DLETA)
本文分享自微信公衆號 - 算法與編程之美(algo_coding)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。