114 專技高考高等考試 資訊技師 程式設計 考古題詳解

114 年・專技高考・高等考試・資訊技師
試題代碼 程式設計

第 一 題20 分

色彩三原色:紅色、綠色及藍色為色彩理論的基礎概念。數位影像中,像素的色彩使用三個介於 0 至 255 之間的整數(包含 0 與 255),分別表示一個色彩的紅、綠、藍三個色彩分量。

一個色彩中,假設其中一個色彩分量的值均大於其他兩個色彩分量的值,即稱這個像素色彩的色調偏向此最大色彩分量。例如:

  • 紅、綠、藍三個色彩分量分別為 20、10、10 時,像素色彩偏向紅色調。
  • 紅、綠、藍三個色彩分量分別為 150、200、180 時,像素色彩偏向綠色調。

請使用 Java 或 C++ 實作一完整程式,計算色彩空間中偏向紅色調的像素色彩總數。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查三個整數的大小比較,以及程式迴圈與計數器的運用。紅色分量嚴格大於綠色、藍色兩分量時,該色彩才偏向紅色:

R>G且R>BR>G \quad\text{且}\quad R>B

題目沒有提供特定像素清單,因此須逐一枚舉紅、綠、藍分量的所有可能組合。每個分量有 256256 種取值,總色彩數為 2563256^3。

解題方法

使用三層迴圈枚舉 R,G,BR,G,B,每次檢查 R>GR>G 且 R>BR>B。符合條件時將計數器加一。

完整程式(C++17):

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 二 題20 分

請使用 114 繪製一個 h×wh\times w 的矩形,其中 hh 代表矩形的高,ww 代表矩形的寬。

第一行使用 114 重複填入;第二行開始,每行先向左移動一個字元,再使用 114 重複填入。

例如,當 h=6h=6、w=8w=8 時,矩形如下所示:

11411411
14114114
41141141
11411411
14114114
41141141

請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含兩個正整數 hh、ww,滿足 1≤h≤1001\le h\le100、1≤w≤251\le w\le25。兩個正整數間使用一個空格分隔。

在讀入 hh、ww 後,輸出對應的矩形。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查字元的週期性排列與二維巢狀迴圈。矩形每一列有 ww 個字元,共輸出 hh 列;每列的排列由列數決定,每三列為一個循環:

  • 第 1、4、7,…1、4、7,\ldots 列:114 重複填入。
  • 第 2、5、8,…2、5、8,\ldots 列:向左移一格,變成 141 重複填入。
  • 第 3、6、9,…3、6、9,\ldots 列:再向左移一格,變成 411 重複填入。

因此列的週期為 33,可用列數對 33 取餘數判斷字元排列。

解題方法

使用兩層迴圈:外層逐列處理 hh 列,內層逐一輸出該列的 ww 個字元。令列索引 ii 從 00 開始、欄索引 jj 從 00 開始,則目前位置的字元為:

pattern[(i+j) mod 3]\text{pattern}[(i+j)\bmod 3]

其中 pattern 為字元陣列 114。

此公式可直接描述每一列的左移效果:

  • i=0i=0 時,依序取索引 0,1,20,1,2,得到 114。
  • i=1i=1 時,依序取索引 1,2,01,2,0,得到 141。
  • i=2i=2 時,依序取索引 2,0,12,0,1,得到 411。

每列輸出完成後換行,總時間複雜度為 O(hw)O(hw),額外空間複雜度為 O(1)O(1)。

解題技巧

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 三 題20 分

給定一個正整數 nn,找出關鍵整數(Pivot integer)xx,使得所有介於 1 至 xx 的區間(含 1 與 xx)之元素總和,等於所有介於 xx 至 nn 的區間(含 xx 與 nn)之元素總和,並回傳關鍵整數 xx。

例如:

  • 當 n=8n=8 時,因為 1+2+3+4+5+6=6+7+81+2+3+4+5+6=6+7+8,所以回傳關鍵整數 x=6x=6。
  • 當 n=1n=1 時,因為 1=11=1,所以回傳關鍵整數 x=1x=1。
  • 當 n=4n=4 時,因為不存在此類關鍵整數,所以回傳 −1-1。

若使用線性搜尋法(Linear search)進行關鍵整數的尋找,當 nn 的值較大時,計算效率很低,並不是一個理想的解題方式,必須使用其他較有計算效率的搜尋方法,例如二元搜尋法(Binary search)。

請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含一個正整數 nn,滿足 1≤n≤10001\le n\le1000,代表區間上限。

在讀入 nn 後,透過二元搜尋法找尋一個區間 [1,n][1,n] 中的關鍵整數。若存在,則回傳關鍵整數值;否則,回傳 −1-1。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查等差級數求和、單調函數與二元搜尋。關鍵整數 xx 必須符合:

1+2+⋯+x=x+(x+1)+⋯+n1+2+\cdots+x=x+(x+1)+\cdots+n

利用等差級數公式,左側為 x(x+1)2\frac{x(x+1)}{2},右側為 n(n+1)2−(x−1)x2\frac{n(n+1)}{2}-\frac{(x-1)x}{2}。注意兩側都包含 xx,整理後可得:

x2=n(n+1)2x^2=\frac{n(n+1)}{2}

因此,只有當 n(n+1)2\frac{n(n+1)}{2} 是完全平方數時,才存在關鍵整數;此時 xx 是該平方數的正平方根。

解題方法

令 T=n(n+1)2T=\frac{n(n+1)}{2}。因為 xx 位於 [1,n][1,n],可以在此範圍以二元搜尋法尋找滿足 x2=Tx^2=T 的整數。

搜尋區間為 [1,n][1,n],每次取中點 mm:

  • 若 m2=Tm^2=T,找到關鍵整數,回傳 mm。
  • 若 m2<Tm^2<T,表示 mm 太小,將搜尋範圍改為 [m+1,n][m+1,n]。
  • 若 m2>Tm^2>T,表示 mm 太大,將搜尋範圍改為 [1,m−1][1,m-1]。
  • 若搜尋區間變空,代表不存在符合條件的整數,回傳 −1-1。

比較方向正確的原因是 m2m^2 在正整數範圍內隨 mm 遞增,故可用二元搜尋排除一半候選值。

例如 n=8n=8 時,T=8⋅92=36T=\frac{8\cdot9}{2}=36,搜尋到 x=6x=6,且 62=366^2=36,所以回傳 66。n=4n=4 時,T=10T=10,不是完全平方數,搜尋後回傳 −1-1。n=1n=1 時,T=1T=1,回傳 11。

Java 程式

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 四 題20 分

遞迴(Recursion)將複雜問題分解為同類但規模較小的子問題,並通過不斷呼叫自身解決這些子問題,直至達到一個可直接解決的基本情況(或稱終止條件),從而使整個問題得以解決。

假設自一個有 nn 顆糖果的糖果罐中抓取糖果,每次只可以抓取 1 顆或 2 顆糖果。一共有多少種不同的抓取糖果方法,可以將糖果罐中所有糖果抓光?

請使用 Java 或 C++ 實作一完整程式,其中輸入資料的第一行包含一個正整數 nn,滿足 1≤n≤10001\le n\le1000,代表糖果罐中糖果總數。

在讀入 nn 後,透過遞迴找出抓取糖果罐中所有糖果之不同方法的數目。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每次抓取 1 顆或 2 顆糖果,抓取順序不同就算不同方法。例如抓取 3 顆糖果時,先抓 1 顆再抓 2 顆,與先抓 2 顆再抓 1 顆,是兩種不同方法。

令 f(n)f(n) 表示抓光 nn 顆糖果的方法數。若第一次抓 1 顆,剩下 n−1n-1 顆;若第一次抓 2 顆,剩下 n−2n-2 顆。因此:

f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)

當罐中沒有糖果時,代表已完成一種抓取方式,所以 f(0)=1f(0)=1;抓 1 顆糖果只有一種方式,所以 f(1)=1f(1)=1。

解題方法

直接用遞迴套用上述遞迴式,但對每個 nn 重複計算會耗費大量時間,因此使用「記憶化遞迴」:計算過的 f(n)f(n) 儲存在陣列中,之後直接取用。

例如:

f(2)=f(1)+f(0)=2f(2)=f(1)+f(0)=2 f(3)=f(2)+f(1)=3f(3)=f(2)+f(1)=3 f(4)=f(3)+f(2)=5f(4)=f(3)+f(2)=5

n≤1000n\le 1000 時,結果會超過一般整數型別的範圍,因此 Java 程式使用 BigInteger 儲存與運算。記憶化遞迴只需計算各子問題一次,共進行 O(n)O(n) 次遞迴狀態計算。

Java 完整程式

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 五 題20 分

阿姆斯壯數(Armstrong number)是指一個 nn 位數正整數,等於其各位數字的 nn 次方之和。

例如,153 是一個三位數,滿足:

13+53+33=1531^3+5^3+3^3=153

其判定需將數值分解為各位數,並計算各位數字的 nn 次方總和。

請使用 Java 或 C++ 實作一完整程式,列印大於 1 且小於 1000 的正整數中所有阿姆斯壯數。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

阿姆斯壯數是指一個正整數的各位數字,分別取「位數次方」後加總,結果等於原數。若整數有 nn 位,數字為 d1,d2,…,dnd_1,d_2,\ldots,d_n,判定條件為:

d1n+d2n+⋯+dnn=原數d_1^n+d_2^n+\cdots+d_n^n=\text{原數}

例如 153153 有三位數:

13+53+33=1+125+27=1531^3+5^3+3^3=1+125+27=153

解題方法

依序檢查 22 到 999999 的每個整數。對每個整數:

  1. 先計算位數 nn。
  2. 將原數複製到暫存變數,反覆取個位數,並累加該數字的 nn 次方。
  3. 比較累加總和與原數;相等時列印該數。

取出個位數使用 temp % 10,移除個位數使用 temp /= 10。計算次方時以迴圈連乘,避免使用浮點數函式造成整數判定誤差。

C++ 完整程式

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題