114 專技高考高等考試 資訊技師 程式設計 考古題詳解
第 一 題20 分
色彩三原色:紅色、綠色及藍色為色彩理論的基礎概念。數位影像中,像素的色彩使用三個介於 0 至 255 之間的整數(包含 0 與 255),分別表示一個色彩的紅、綠、藍三個色彩分量。
一個色彩中,假設其中一個色彩分量的值均大於其他兩個色彩分量的值,即稱這個像素色彩的色調偏向此最大色彩分量。例如:
- 紅、綠、藍三個色彩分量分別為 20、10、10 時,像素色彩偏向紅色調。
- 紅、綠、藍三個色彩分量分別為 150、200、180 時,像素色彩偏向綠色調。
請使用 Java 或 C++ 實作一完整程式,計算色彩空間中偏向紅色調的像素色彩總數。
登入後即可作答並保存紀錄。
核心觀念
本題考查三個整數的大小比較,以及程式迴圈與計數器的運用。紅色分量嚴格大於綠色、藍色兩分量時,該色彩才偏向紅色:
題目沒有提供特定像素清單,因此須逐一枚舉紅、綠、藍分量的所有可能組合。每個分量有 種取值,總色彩數為 。
解題方法
使用三層迴圈枚舉 ,每次檢查 且 。符合條件時將計數器加一。
完整程式(C++17):
第 二 題20 分
請使用 114 繪製一個 的矩形,其中 代表矩形的高, 代表矩形的寬。
第一行使用 114 重複填入;第二行開始,每行先向左移動一個字元,再使用 114 重複填入。
例如,當 、 時,矩形如下所示:
11411411
14114114
41141141
11411411
14114114
41141141
請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含兩個正整數 、,滿足 、。兩個正整數間使用一個空格分隔。
在讀入 、 後,輸出對應的矩形。
登入後即可作答並保存紀錄。
核心觀念
本題考查字元的週期性排列與二維巢狀迴圈。矩形每一列有 個字元,共輸出 列;每列的排列由列數決定,每三列為一個循環:
- 第 列:
114重複填入。 - 第 列:向左移一格,變成
141重複填入。 - 第 列:再向左移一格,變成
411重複填入。
因此列的週期為 ,可用列數對 取餘數判斷字元排列。
解題方法
使用兩層迴圈:外層逐列處理 列,內層逐一輸出該列的 個字元。令列索引 從 開始、欄索引 從 開始,則目前位置的字元為:
其中 pattern 為字元陣列 114。
此公式可直接描述每一列的左移效果:
- 時,依序取索引 ,得到
114。 - 時,依序取索引 ,得到
141。 - 時,依序取索引 ,得到
411。
每列輸出完成後換行,總時間複雜度為 ,額外空間複雜度為 。
解題技巧
第 三 題20 分
給定一個正整數 ,找出關鍵整數(Pivot integer),使得所有介於 1 至 的區間(含 1 與 )之元素總和,等於所有介於 至 的區間(含 與 )之元素總和,並回傳關鍵整數 。
例如:
- 當 時,因為 ,所以回傳關鍵整數 。
- 當 時,因為 ,所以回傳關鍵整數 。
- 當 時,因為不存在此類關鍵整數,所以回傳 。
若使用線性搜尋法(Linear search)進行關鍵整數的尋找,當 的值較大時,計算效率很低,並不是一個理想的解題方式,必須使用其他較有計算效率的搜尋方法,例如二元搜尋法(Binary search)。
請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含一個正整數 ,滿足 ,代表區間上限。
在讀入 後,透過二元搜尋法找尋一個區間 中的關鍵整數。若存在,則回傳關鍵整數值;否則,回傳 。
登入後即可作答並保存紀錄。
核心觀念
本題考查等差級數求和、單調函數與二元搜尋。關鍵整數 必須符合:
利用等差級數公式,左側為 ,右側為 。注意兩側都包含 ,整理後可得:
因此,只有當 是完全平方數時,才存在關鍵整數;此時 是該平方數的正平方根。
解題方法
令 。因為 位於 ,可以在此範圍以二元搜尋法尋找滿足 的整數。
搜尋區間為 ,每次取中點 :
- 若 ,找到關鍵整數,回傳 。
- 若 ,表示 太小,將搜尋範圍改為 。
- 若 ,表示 太大,將搜尋範圍改為 。
- 若搜尋區間變空,代表不存在符合條件的整數,回傳 。
比較方向正確的原因是 在正整數範圍內隨 遞增,故可用二元搜尋排除一半候選值。
例如 時,,搜尋到 ,且 ,所以回傳 。 時,,不是完全平方數,搜尋後回傳 。 時,,回傳 。
Java 程式
第 四 題20 分
遞迴(Recursion)將複雜問題分解為同類但規模較小的子問題,並通過不斷呼叫自身解決這些子問題,直至達到一個可直接解決的基本情況(或稱終止條件),從而使整個問題得以解決。
假設自一個有 顆糖果的糖果罐中抓取糖果,每次只可以抓取 1 顆或 2 顆糖果。一共有多少種不同的抓取糖果方法,可以將糖果罐中所有糖果抓光?
請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含一個正整數 ,滿足 ,代表糖果罐中糖果總數。
在讀入 後,透過遞迴找出抓取糖果罐中所有糖果之不同方法的數目。
登入後即可作答並保存紀錄。
核心觀念
每次抓取 1 顆或 2 顆糖果,抓取順序不同就算不同方法。例如抓取 3 顆糖果時,先抓 1 顆再抓 2 顆,與先抓 2 顆再抓 1 顆,是兩種不同方法。
令 表示抓光 顆糖果的方法數。若第一次抓 1 顆,剩下 顆;若第一次抓 2 顆,剩下 顆。因此:
當罐中沒有糖果時,代表已完成一種抓取方式,所以 ;抓 1 顆糖果只有一種方式,所以 。
解題方法
直接用遞迴套用上述遞迴式,但對每個 重複計算會耗費大量時間,因此使用「記憶化遞迴」:計算過的 儲存在陣列中,之後直接取用。
例如:
時,結果會超過一般整數型別的範圍,因此 Java 程式使用 BigInteger 儲存與運算。記憶化遞迴只需計算各子問題一次,共進行 次遞迴狀態計算。
Java 完整程式
第 五 題20 分
阿姆斯壯數(Armstrong number)是指一個 位數正整數,等於其各位數字的 次方之和。
例如,153 是一個三位數,滿足:
其判定需將數值分解為各位數,並計算各位數字的 次方總和。
請使用 Java 或 C++ 實作一完整程式,列印大於 1 且小於 1000 的正整數中所有阿姆斯壯數。
登入後即可作答並保存紀錄。
核心觀念
阿姆斯壯數是指一個正整數的各位數字,分別取「位數次方」後加總,結果等於原數。若整數有 位,數字為 ,判定條件為:
例如 有三位數:
解題方法
依序檢查 到 的每個整數。對每個整數:
- 先計算位數 。
- 將原數複製到暫存變數,反覆取個位數,並累加該數字的 次方。
- 比較累加總和與原數;相等時列印該數。
取出個位數使用 temp % 10,移除個位數使用 temp /= 10。計算次方時以迴圈連乘,避免使用浮點數函式造成整數判定誤差。