108 一般警察特考三等 警察資訊管理人員 物件導向程式設計 考古題詳解

108 年・一般警察特考・三等・警察資訊管理人員
試題代碼 物件導向程式設計

第 一 題25 分

若使用者輸入 17、18、19,請問輸出為多少?

#include<iostream> using namespace std;

int main() { int n; int i; int ans; int h;

while (cin >> n) {
    ans = 1;
    h = n / 2;
    i = 2;

    while (i <= h) {
        if (n % i == 0) {
            ans = 0;
        }
        i = i + 1;
    }

    if (ans == 1) {
        cout << "Y" << endl;
    }
    else if (ans == 2) {
        cout << "M" << endl;
    }
    else if (ans == 3) {
        cout << "K" << endl;
    }
    else {
        cout << "N" << endl;
    }
}

return 0;

}

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

這一題的完整詳解

核心觀念

本題為經典的程式追蹤(Code Tracing)​題型,測驗考生對 C++ 基礎控制流程與基礎數論演算法的理解,主要包含以下核心要點:

  1. 質數判別演算法(Primality Test): 本題內層迴圈採用「試除法(Trial Division)」。數學上,若正整數 n>1n > 1 無法被區間 [2,⌊n/2⌋][2, \lfloor n/2 \rfloor] 內的任何整數整除,則 nn 必為質數(Prime number);反之若存在任一因數使得 n(modi)=0n \pmod i = 0,則 nn 為合數(Composite number)。
  2. 巢狀迴圈與旗標變數(Nested Loops & Flag Variable): 變數 ans 作為布林旗標(Flag)。外層迴圈每讀入一個新數字,ans 均被重置為 1;若在區間內找到任一可整除的因數,ans 即被覆寫為 0。
  3. 整數除法與餘數運算: 變數宣告皆為 int,運算式 h = n / 2 採用整數除法(自動無條件捨去小數點);n % i 則計算 nn 除以 ii 的餘數。
  4. 多向條件分支(Multi-way Branching)與干擾程式碼: if-else if-else 結構中包含 ans == 2(輸出 M)與 ans == 3(輸出 K)的條件分支,但分析整段邏輯可發現 ans 僅可能取值為 1 或 0,因此中間分支為典型的命題干擾項(Distractor)。
  5. 標準輸出與換行控制: cout << ... << endl; 於印出字元後會立即輸出換行符號(\n)並清空緩衝區,故各筆輸入的輸出結果均獨立成行。

解題方法

本題切入點為「先掌握演算法整體語義,再循序進行變數追蹤」。

1. 演算法行為分析

  • 外層迴圈:while (cin >> n) 持續讀入整數 nn。
  • 初始化:
  • ans = 1;(先假設 nn 為質數)。
  • h = n / 2;(計算檢查上限 ⌊n/2⌋\lfloor n/2 \rfloor)。
  • i = 2;(測試除數從 2 開始)。
  • 內層迴圈:while (i <= h) 逐一測試 i=2,3,…,hi = 2, 3, \dots, h。
  • 若 n(modi)==0n \pmod i == 0,則設定 ans = 0(代表找到因數,判定為非質數)。
  • 注意:此演算法在找到因數後並未使用 break 提早跳出,而是會跑滿完整迴圈直至 i>hi > h。
  • 輸出判斷:
  • 若 ans == 1:輸出 Y(表示是質數)。
  • 若 ans == 0:不符合 ans == 1、ans == 2、ans == 3,最終進入 else 輸出 N(表示非質數)。

2. 輸入數值詳細追蹤

針對使用者輸入的 17、18、19 逐筆追蹤:

  • 第一筆輸入:n=17n = 17
  • h=17/2=8h = 17 / 2 = 8。
  • ii 從 2 遞增至 8,計算 17(modi)17 \pmod i:
  • 17(mod2)=117 \pmod 2 = 1
🔒

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

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

免費註冊

第 二 題25 分

請閱讀下列程式碼,並回答以下問題:

#include<iostream> using namespace std;

int main() { int nA = 10; int nB = 50;

nA = nB;
nB = nA;

cout << "nA=" << nA << " nB=" << nB << endl;

return 0;

}

(一) nA=nA= ____。(5 分)

(二) nB=nB= ____。(5 分)

(三) 若 nAnA 與 nBnB 為相同數值,請問程式碼應如何修改,以達到 nAnA 與 nBnB 數值互換?(作答請用文字表達,答案不用程式碼)(15 分)

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

這一題的完整詳解

核心觀念

本題評量程式設計最基礎但也最關鍵的兩大概念:

  1. 指派運算子(Assignment Operator)與記憶體覆寫(Variable Overwrite): 在 C++ 中,單等號 = 是指派運算子,其語意為「評估右式(rvalue)的值,並複製寫入左式(lvalue)的變數記憶體中」。變數原先儲存的舊值在被賦予新值後會立即被覆寫消失。
  2. 循序結構(Sequential Execution)與交換機制(Swap Pattern): 程式碼由上而下逐行執行。若欲對調兩個變數的值,不能僅靠兩次相互指派;因為第一次指派會使其中一個變數的原始數值永久遺失,造成兩個變數最後持有相同數值。標準解法必須藉由「第三變數(暫存變數,Temporary Variable)」先備份其中一個數值,或呼叫標準函式庫提供的交換函式。

解題方法

(一) 與 (二) 的執行歷程與數值推導

透過「變數追蹤(Variable Trace)」逐步檢視記憶體狀態變化:

  1. 初始狀態:
  • 執行 int nA = 10;:記憶體配置整數變數 nA,其初始值為 1010。
  • 執行 int nB = 50;:記憶體配置整數變數 nB,其初始值為 5050。
  1. 第一道指派:
  • 執行 nA = nB;:讀取 nB 的數值(5050),並寫入 nA。
  • 此時 nA 的舊值 1010 被覆蓋,nA 的值變為 5050;nB 的值仍維持 5050。
  1. 第二道指派:
  • 執行 nB = nA;:讀取 nA 當前的值(已是 5050),並寫入 nB。
  • 此時 nB 被寫入 5050,其值依舊為 5050。
  1. 輸出結果:
  • 執行 cout << "nA=" << nA << " nB=" << nB << endl;,印出 nA=50 nB=50。

推導結果:

  • (一) nA=50nA = 50
  • (二) nB=50nB = 50

(三) 程式修改方式說明(文字敘述)

🔒

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

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

免費註冊

第 三 題25 分

若使用者輸入 5,請問輸出值為何?

#include <iostream> using namespace std;

int main() { int n; cin >> n;

for (int i = 1; i <= n; ++i)
{
    for (int j = 0; j < n - i; ++j)
        cout << "/";

    for (int j = 0; j < i * 2 - 1; ++j)
        cout << "*";

    for (int j = 0; j < n - i; ++j)
        cout << "\\";

    cout << endl;
}

system("pause");
return 0;

}

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

這一題的完整詳解

核心觀念

本題測驗 C++ 的巢狀迴圈(Nested Loops)控制流程與字串跳脫字元(Escape Sequence)​的處理機制:

  1. 巢狀迴圈與列印通式:外層迴圈控制輸出之「列數(Row)」,內層各獨立迴圈分別依據外層計數變數推導的通式,依序輸出指定數量的字元。
  2. 跳脫字元機制:在 C/C++ 字串常數中,反斜線 \ 為跳脫字元(Escape Character)。欲輸出字元 \,必須寫成 "\\",輸出時僅呈現單一反斜線。
  3. 等差圖形對稱性:字元個數與列數 ii 呈線性代數關係。斜線數為遞減等差數列,星號數為奇數遞增等差數列。

解題方法

使用者輸入 n=5n = 5。外層迴圈以變數 ii 計數,範圍為 i=1i = 1 至 i=5i = 5(共 5 列)。各列執行順序如下:

  1. 第 1 個內層迴圈:for (int j = 0; j < n - i; ++j) cout << "/"; 輸出正斜線 /,次數為 n−i=5−in - i = 5 - i 次。
  2. 第 2 個內層迴圈:for (int j = 0; j < i * 2 - 1; ++j) cout << "*"; 輸出星號 *,次數為 2i−12i - 1 次(即連續奇數數列)。
  3. 第 3 個內層迴圈:for (int j = 0; j < n - i; ++j) cout << "\\"; 輸出反斜線 \,次數為 n−i=5−in - i = 5 - i 次。
  4. 換行指令:cout << endl; 換至下一列。

依各列逐一代入 ii 值進行追蹤(Trace Table):

  • 第 1 列(i=1i = 1):
  • 正斜線 /:5−1=45 - 1 = 4 個
  • 星號 *:2(1)−1=12(1) - 1 = 1 個
  • 反斜線 \:5−1=45 - 1 = 4 個
  • 該列輸出:////*\\\\
  • 第 2 列(i=2i = 2):
  • 正斜線 /:5−2=35 - 2 = 3 個
🔒

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

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

免費註冊

第 四 題25 分

在下方程式碼中,若使用者輸入值為「520」,請問輸出值為何?

#include <iostream> using namespace std;

int main() { int number_input, i, c;

cin >> number_input;
cout << number_input << " = ";

i = 2;

while (i <= number_input) {
    c = 0;

    while (number_input % i == 0) {
        number_input /= i;
        ++c;
    }

    if (c > 0) {
        cout << i;

        if (c > 1)
            cout << "^" << c;

        if (number_input > 1)
            cout << " * ";
    }

    (i >= 3) ? (i += 2) : ++i;
}

cout << endl;
return 0;

}

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

這一題的完整詳解

核心觀念

本題為典型的「質因數分解(Prime Factorization)」演算法追蹤題,涵蓋以下核心程式邏輯與 C++ 語法觀念:

  1. 質因數分解邏輯:從最小質數 i=2i = 2 開始嘗試整除,若能整除則重複除以 ii 並累計次數 cc,直到無法整除為止。因為較小的合數因數早被其質因數除盡,故能整除的 ii 必定為質數。
  2. 步進控制(三元運算子):(i >= 3) ? (i += 2) : ++i;。當 i=2i=2 時執行 ++i 使 ii 變為 33;當 i≥3i \ge 3 時每次遞增 22(即檢查 3,5,7,9,11,13…3, 5, 7, 9, 11, 13 \dots),藉由跳過所有偶數提升檢驗效率。
  3. 動態邊界條件:外層迴圈條件為 i <= number_input。由於 number_input 在內層迴圈中會被動態除減(例如 520→65→13→1520 \to 65 \to 13 \to 1),外層終止條件的上界會隨之急遽縮小,大幅減少迴圈次數。
  4. 輸出格式控制:
  • 次方符號:當次數 c>1c > 1 時才輸出 ^ 與次數。
  • 乘號處理:當前質因數分解後,若剩餘的 number_input > 1,才輸出 " * ",避免在最後一個因數後方輸出多餘的乘號。

解題方法

題目輸入值為 520,程式執行之追蹤與推導步驟如下:

步驟一:輸入與前綴輸出

  • cin >> number_input; 讀入 520。
  • cout << number_input << " = "; 輸出:520 = (注意等號兩側有空格)。
  • 初始化質數指標 i = 2。

步驟二:迴圈追蹤(逐輪推導)

輪次當前 ii外層條件 (i≤number_inputi \le \text{number\_input})內層整除次數 cc更新後之 number_input輸出內容步進後之 ii
1222≤5202 \le 520(成立)33 (520÷23=65520 \div 2^3 = 65)65652^3 * 33
2333≤653 \le 65(成立)00(無法整除)6565(無輸出)55
3555≤655 \le 65(成立)11 (65÷5=1365 \div 5 = 13)13135 * 77
4777≤137 \le 13(成立)00(無法整除)1313(無輸出)99
5999≤139 \le 13(成立)00(無法整除)1313(無輸出)1111
6111111≤1311 \le 13(成立)00(無法整除)1313(無輸出)1313
🔒

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

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

免費註冊

其他考古題