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

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

第 一 題20 分

使用 C++ 或 Java 設計一個函式(function、method),傳入一個大於或等於 22 的整數,可以列出輸入之整數的質因數乘積。

注意:符號 ^ 代表次方。

執行範例:

foo(13)foo(13) 輸出:13=1∗1313=1*13

foo(30)foo(30) 輸出:30=2∗3∗530=2*3*5

foo(675)foo(675) 輸出:675=33∗52675=3^3*5^2

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

這一題的完整詳解

核心觀念

本題考查質因數分解與迴圈設計。質因數是本身為質數的因數;依算術基本定理,每個大於 11 的整數都能唯一表示為質數的乘積。

例如:

675=3×3×3×5×5=33×52675=3\times3\times3\times5\times5=3^3\times5^2

題目範例也要求輸出沒有質因數重複時的格式,例如 30=2∗3∗530=2*3*5。輸入為質數時,另依題目指定格式輸出 11,例如 13=1∗1313=1*13。

解題方法

由最小可能的質因數 22 開始,逐一測試整數 dd 是否能整除目前尚未分解的數 nn:

  1. 若 dd 能整除 nn,就持續除以 dd,並計算其出現次數。
  2. 若 dd 出現一次以上,將質因數與次方輸出;次方為 11 時省略 ^1。
  3. 當 dd 不再能整除 nn,繼續測試下一個整數。
  4. 測試至 d2>nd^2>n 時,若 n>1n>1,剩下的 nn 必為質數,直接輸出。

只需測試到平方根,是因為合數必有一個不大於其平方根的因數。若一直沒有找到這樣的因數,剩下的數便是質數。

C++ 參考程式

🔒

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

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

免費註冊

第 二 題20 分

一個骰子共有六面,點數分別為 1∼61\sim6。遊戲時擲出三個骰子,若三個骰子的點數相同,則分數為三個骰子點數總和再乘以 33;若其中有兩個骰子點數相同,另一個不同,則分數為點數不同骰子的點數。若三個骰子的點數都不同,則重新再擲三個骰子,直到出現有分數的情況為止。請使用物件導向程式語言 C++ 或 Java 為此遊戲設計程式。

執行範例一:

骰子點數:33、33、66;得分:66

執行範例二:

骰子點數:22、22、22;得分:1818

執行範例三:

骰子點數:11、22、33;重擲

骰子點數:66、55、44;重擲

骰子點數:55、11、55;得分:11

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

這一題的完整詳解

核心觀念

本題考查物件導向程式設計中的條件判斷、迴圈控制與亂數產生。每次擲出三個骰子後,依點數相同的情形決定得分:

  • 三個點數相同:得分為三顆骰子點數總和再乘以 33。
  • 恰有兩個點數相同:得分為那顆點數不同的骰子的點數。
  • 三個點數都不同:本次沒有得分,重新擲骰,直到出現前兩種情形。

解題方法

將三顆骰子的點數存入陣列,每次擲骰後先輸出點數,再按照下列順序判斷:

  1. 若三個點數相同,計算 (d1+d2+d3)×3(d_1+d_2+d_3)\times 3,輸出得分並結束。
  2. 若恰有一組點數相同,找出與另外兩顆不同的點數,將該點數作為得分。
  3. 否則三個點數皆不同,輸出「重擲」,進入下一次迴圈。

判斷順序先檢查三個點數是否全相同,再檢查兩個點數是否相同,可清楚區分兩種得分情形。

C++ 程式

🔒

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

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

免費註冊

第 三 題40 分

二元搜尋樹(binary search tree)是一種資料經過整理後的二元樹。對於任何一個節點,若左子樹(left subtree)存在,則左子樹所有節點的值均小於自己的值;若右子樹(right subtree)存在,則右子樹所有節點的值均大於自己的值。

請用 C++ 或 Java 寫一個二元搜尋樹的類別(class),包括新增一個節點(insert)、刪除一個節點(remove)以及中序走訪(inorder)這三個函式(function),並撰寫主程式完成以下工作:

  • 依序新增 2525、1515、2020、3030、4040 到一個空的二元搜尋樹。
  • 以中序走訪此樹。
  • 刪除 3030。
  • 增加 3030。
  • 以中序走訪此樹。

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

這一題的完整詳解

核心觀念

二元搜尋樹(Binary Search Tree, BST)遵守以下規則:對每個節點,左子樹所有值都小於節點值,右子樹所有值都大於節點值。本題不插入重複值。

BST 的中序走訪順序為「左子樹、根節點、右子樹」,因此走訪結果會由小到大排列。

刪除節點時分三種情況:

  1. 沒有子節點:直接刪除。
  2. 只有一個子節點:以子節點取代被刪除的節點。
  3. 有兩個子節點:以其中序後繼(右子樹的最小值)或中序前驅(左子樹的最大值)取代,再刪除該後繼或前驅的原節點。

解題方法

依序插入 2525、1515、2020、3030、4040:

  • 2525 成為根節點。
  • 15<2515<25,插入 2525 的左側。
  • 20<2520<25,往左比較;20>1520>15,插入 1515 的右側。
  • 30>2530>25,插入 2525 的右側。
  • 40>2540>25,往右比較;40>3040>30,插入 3030 的右側。

所得結構如下:

 25
 / \
 15 30
 \ \
 20 40

中序走訪依序為 15,20,25,30,4015,20,25,30,40。

刪除 3030 時,節點 3030 只有右子節點 4040,因此以 4040 取代 3030:

 25
 / \
 15 40
 \
 20

再插入 3030:30>2530>25 且 30<4030<40,因此插入 4040 的左側:

 25
 / \
 15 40
 \ /
 20 30

再次中序走訪仍為 15,20,25,30,4015,20,25,30,40。

C++ 程式

🔒

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

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

免費註冊

第 四 題20 分

請寫出下列 Java 語言程式的執行結果,也就是下列兩個敘述的輸出結果:

System.out.println("Sum before the swap: " + Element.sum(e));

System.out.println("Sum after the swap: " + Element.sum(e));

Trace.java:

public class Trace{ public static void main(String[] args){ Element[] e = new Element[5]; e[0] = new Element(10); e[1] = new Element(5); e[2] = e[1]; e[3] = e[0]; e[4] = new Element(5); System.out.println("Sum before the swap: " + Element.sum(e)); for(int i = 0; i < e.length - 1; i++){ if(e[i] == e[i+1]){ break; } else{ Element eTmp = e[i]; e[i] = e[i+1]; e[i+1] = eTmp; } } System.out.println("Sum after the swap: " + Element.sum(e)); } }

Element.java:

public class Element{ private int value;

public Element(int value){
    this.value = value;
}

public int getValue(){
    return value;
}

public static int sum(Element [] e){
    int sum = e[0].getValue();
    for(int i = 0; i < e.length - 1; i++){
        if(e[i].getValue() <= e[i+1].getValue()){
            continue;
        }
        sum += e[i+1].getValue();
    }
    return sum;
}

}

執行結果:

Sum before the swap: 20

Sum after the swap: 10

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

這一題的完整詳解

核心觀念

本題考兩個 Java 觀念:

  1. 陣列元素可以指向同一個物件:e[1] = e[2] 這類指定會複製參考,不會建立新物件。判斷 e[i] == e[i+1] 時,== 比較的是兩者是否參考同一個物件。
  2. 交換陣列元素只改變參考位置:透過暫存變數交換 e[i] 與 e[i+1],不會修改物件內的 value。
  3. Element.sum(e) 不是一般的陣列總和:每次比較相鄰元素,只有當前一個值大於下一個值時,才把下一個值加進總和。

解題方法

先以物件代號標示陣列中的參考:

索引參考value
e[0]A10
e[1]B5
e[2]B5
e[3]A10
e[4]C5

其中 e[2] = e[1],所以兩者都指向 B;e[3] = e[0],所以兩者都指向 A。C 則是另一個值為 5 的物件。

交換前計算總和

sum 初值為 e[0].getValue,即 1010。逐一檢查相鄰值:

相鄰索引比較動作總和
0, 110≤510 \le 5 為否加入 e[1] 的值 515
1, 25≤55 \le 5 為是continue,不加值15
2, 35≤105 \le 10 為是continue,不加值15
3, 410≤510 \le 5 為否加入 e[4] 的值 520

因此交換前輸出:

Sum before the swap: 20

執行交換迴圈

🔒

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

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

免費註冊

其他考古題