9/10 本週考試重點總結 (題目分析與Java實作)
Problem A: GCD (最大公因數)
- 目標: 計算兩個正整數 和 的最大公因數。
- 輸入:
- 第一行是測試案例數量 。
- 接下來 行,每行包含兩個整數 和 ()。
- 輸出: 每個測試案例的最大公因數。
- 核心考點:
- 必須自己實現 GCD 演算法,不能使用內建函式庫。
- 歐幾里得演算法 (Euclidean algorithm) 是最推薦的方法,無論是使用遞迴或迭代版本都可以。
1 | import java.util.Scanner; |
Problem B: Score (分數計算)
- 目標: 根據公式
Score = S * (N - 2 * K) / N計算多選題得分。 - 輸入: 多筆資料,每行包含三個整數 (總分)、 (選項數)、 (答錯數)。
- 輸出: 計算出的分數(浮點數)。若分數低於 0,則輸出 0.0。
- 核心考點:
- 數學運算: 需注意整數與浮點數的型別轉換,以避免精度損失。
- 條件判斷: 必須處理分數小於 0 的情況,可以使用
if條件式或Math.max(0, calculated_score)來實現。
1 | import java.util.Scanner; |
Problem C: Shopping (購物餘額)
- 目標: 根據初始存款和一系列交易,即時計算並輸出每次交易後的餘額。
- 輸入:
- 第一行是初始存款 。
- 接下來有多行交易金額 ( 為收入, 為支出)。
- 輸出: 每發生一筆交易,就輸出一行更新後的餘額。
- 核心考點:
- 迴圈與狀態更新: 使用迴圈持續讀取輸入,並在一個變數中不斷更新餘額。
- 輸入處理: 程式必須能處理到沒有更多輸入為止 (End-of-File)。
1 | import java.util.Scanner; |
Problem D: Taipei 101 Vertical Marathon (爬樓梯問題)
- 目標: 計算爬 階樓梯的方法總數,每次只能爬 1 階或 2 階。
- 輸入:
- 第一行是測試案例數量 。
- 接下來 行,每行一個整數 ()。
- 輸出: 爬到第 階的方法數。
- 核心考點:
- 遞迴/動態規劃: 這是典型的斐波那契數列 (Fibonacci sequence) 應用題。
- 遞迴關係式:
ways(n) = ways(n-1) + ways(n-2)。 - 基本情況:
ways(1) = 1,ways(2) = 2。由於 的範圍很小,可以使用遞迴、迭代或備忘錄法來解。
1 | import java.util.Scanner; |
Problem E: Formula solution (一元二次方程式解的個數)
- 目標: 判斷一元二次方程式 有多少個實數解。
- 判別式: 。
- 輸入: 多筆資料,每行包含三個整數 ()。
- 輸出: 根據 的值輸出實數解的個數(
2,1, 或0)。 - 核心考點:
- 數學知識: 運用判別式 的正、零、負來判斷解的個數。
- 條件分支: 使用
if-elif-else結構來處理三種情況並給出對應輸出。
1 | import java.util.Scanner; |
Problem F: Zapping (電視選台)
- 目標: 在 0-99 的循環頻道中,從頻道 切換到 所需的最少按鍵次數(只能按「上」或「下」)。
- 輸入: 多筆資料,每行包含兩個整數 和 ,並以
-1 -1作為輸入結束的標記。 - 輸出: 從 到 的最少按鍵次數。
- 核心考點:
- 循環距離計算:
- 向上走的步數:
(b - a + 100) % 100 - 向下走的步數:
(a - b + 100) % 100
- 向上走的步數:
- 比較: 取上述兩種走法步數的最小值。
- 輸入終止: 迴圈需在讀到
-1 -1時結束。
- 循環距離計算:
1 | import java.util.Scanner; |
Problem G: Digital Sum (各位數之和)
- 目標: 計算一個正整數 的所有位數加總。
- 輸入:
- 第一行是測試案例數量 。
- 接下來 行,每行一個整數 ()。
- 輸出: 的各位數之和。
- 核心考點:
- 數字拆解:
- 方法一 (數學): 使用迴圈,透過
% 10取出個位數,再用/ 10去掉個位數,直到數字變為 0。 - 方法二 (字串): 將數字轉為字串,遍歷字串中的每個字元,將其轉回數字後相加。
- 方法一 (數學): 使用迴圈,透過
- 數字拆解:
1 | import java.util.Scanner; |
說些什麼吧!