# a005 - Eva的回家作業 ### 題目連結: [a005](https://zerojudge.tw/ShowProblem?problemid=a005) ### 題目解析 * 給定一個數列的前四項,判斷這個數列是等差或是等比級數,並且依照判斷的結果輸出第五項 ### 題目類型 數學/流程設計/條件判斷/基礎輸出入 ### 範例測資解讀 * 輸入 * 輸入可能兩行或是多行,題目的第一行代表數列的數目,也就是說程式需要先判斷等等有幾個數列需要處理,設計一個變數 t 儲存這個數量,就能使用迴圈,分別計算各個數列的結果 * 第二行以後的每一行,代表一個數列的前四項,也就是真正的數列資料 * 此題有測資輸入的範圍限制,因為是基礎題型,所以不需要考慮過大或是造成數值上限 overflow, 或無法計算的情況 * 輸出 * 輸出為每個原輸入數列,並且加上第五項 ### 其他注意事項 * 輸入說明的部分有解釋輸入的測資前五項均不會大於105,代表這個問題數值範圍不會過大 ### 程式解析 * 首先處理輸入資料,由於此題的輸入資料每行可能不一樣多,因此可以使用 input() 的方式對於各行逐步處理輸入資料 * 建議輸入資料的變數名稱,與題目中的說入說明相同,解讀程式時比較容易找到問題 ``` Python t = input() for i in range(t): #使用 t 作為迴圈的次數,代表會有幾筆數列 nums = list(map(int, input().split())) ``` 輸入資料除了上述的方式外,若你剛開始學習程式尚未了解 list 串列結構 也可以設計成四個變數,分別代表數列的前四項 ``` Python t = input() for i in range(t): a, b, c, d = map(int, input().split()) ``` 判斷數列為等差或是等比可以觀察前四項數字中,任兩項的差值,若差值皆為相同,則可判定此數列為 **等差** ![差值](https://i.imgur.com/XbGuhy9.png =400x) 土法煉鋼的判斷方法可以寫成這樣 ``` Python diff1 = seq[1]-seq[0] diff2 = seq[2]-seq[1] diff3 = seq[3]-seq[2] if diff1 == diff2 and diff2 == diff3: ``` 若差值程式倍數成長,則可判定此數列為 **等比** ![等比差值](https://i.imgur.com/TdKuJsU.png =400x) 等比級數的判斷方法較為複雜一些,必須使用除法任兩項是否整除,但這個計算方式會有漏洞,任何數除以1或自己亦為整除,因此必須判段所有的數量項,才能確認是否真的為等比級數 ``` Python diff = int(seq[3]/seq[2]); for i in range(0, 3+1): if seq[i]%diff != 0: ``` ### 完整程式碼 (此程式碼並非最簡略寫法) ``` Python=01 import sys #start t= int(input()) for i in range(t): seq = list(map(int, input().split())) isArithmetic = False isGeometric = True # 判斷等差 diff1 = seq[1]-seq[0] diff2 = seq[2]-seq[1] diff3 = seq[3]-seq[2] if diff1 == diff2 and diff2 == diff3: isArithmetic = True diff = int(seq[3]/seq[2]); # 判斷等比 for i in range(0, 3+1): if seq[i]%diff != 0: isGeometric = False break if isArithmetic == True: diff = diff1 for i in range(4): print(seq[i], end=' ') print(seq[3]+diff) else: for i in range(4): print(seq[i], end=' ') print(seq[3]*diff) ``` * 由於此題題目有說明,==已經知道這些數列只可能是等差或等比數列==,故邏輯可以修改為,如果不是等差,那就是等比,以此邏輯思考,則可以省略等比計算的部分 ###### tags: `基礎15題解` `APCS` `ZeroJudge`