108 年 國立臺灣大學生物機電系碩士班丙組《計算機概論(D)》
第 1 題10 分
Write the number in IEEE single precision floating point format. Give your answer in binary.
登入後即可作答並保存紀錄。
此題考驗對 IEEE 754 單精度浮點數表示法的理解。單精度浮點數(32 位元)的格式為:1 位元符號位元(S)、8 位元指數位元(E),以及 23 位元尾數(M)。
將 轉換為二進位浮點數的步驟如下:
-
符號位元 (S): 由於是負數,符號位元為 。
-
轉換為二進位:
首先將 轉換為二進位。
... 這個小數點後的二進位表示是循環的:。
所以,。 -
科學記號表示:
將二進位數正規化,使其形式為 。
。
這裡,尾數部分是 ,指數部分是 。 -
計算指數位元 (E):
IEEE 754 單精度浮點數使用偏差指數(biased exponent)。實際指數值 加上偏差值 得到指數位元。
實際指數 。
偏差指數 。
將 轉換為 8 位元的二進位:
。
第 2 題10 分
Recall that is "exclusive or". Define .
a) Rewrite as a sum-of-products where each product depends on all three variables , , and . Use a truth table to compute your solution. (5%)
b) Draw a circuit for the sum-of-products in (a). (5%)
登入後即可作答並保存紀錄。
此題考驗邏輯函數的化簡與電路設計。
核心觀念:
- XNOR 邏輯: 代表 和 相等的邏輯,也就是 XNOR。
- AND 邏輯: 代表 AND。
- Sum-of-Products (SOP): 將一個邏輯函數表示為數個 AND 項的 OR 組合。
- 全變數 SOP: 要求 SOP 中的每一個 AND 項都包含所有輸入變數(或其反相)。
- 真值表: 列出所有輸入組合及其對應的輸出。
- 電路圖: 使用基本邏輯閘(AND, OR, NOT, XOR, XNOR)實現邏輯函數。
Part a) Rewrite as a sum-of-products where each product depends on all three variables , , and . Use a truth table to compute your solution.
給定邏輯函數 。
首先,我們知道 的真值表:
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
接著,計算 (XNOR):
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
然後,計算 :
| 0 | 0 | 0 | 1 | 0 |
| 0 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
從真值表中,我們可以看到當 的情況有兩列:
現在,我們要將 轉換為全變數 SOP。這意味著每個 AND 項都必須包含 , , (或其反相)。
對於第一種情況 (),對應的 AND 項是 。
對於第二種情況 (),對應的 AND 項是 。
第 3 題10 分
Draw a parse tree for the derivation of "bbbaaa" using the grammar below.
登入後即可作答並保存紀錄。
核心觀念
本題考查上下文無關文法(Context-Free Grammar, CFG)的推導與解析樹(parse tree)。
解析樹必須符合:
- 根節點為開始符號 。
- 每個非終結符號依照一條產生式展開。
- 葉節點由左至右讀出目標字串。
- 代表空字串,不會在葉節點中產生實際字元。
需注意:題目所列文法只有
因此每次展開 後,右側仍會保留一個 ,沒有任何產生式能將 消去。故依題目原文, 無法推導出任何純終結符號字串。
以下依本題欲得到字串「bbbaaa」的合理修正,假設原文遺漏了:
解題方法
目標字串為:
產生式
會固定產生:
- 一個由 產生的字串;
- 一個終結符號 ;
- 內層的 ;
- 三個終結符號 。
因為目標字串最後正好有三個 ,可令內層 。此時前面的 與固定的 必須共同產生三個 ,所以令:
利用
可推導:
完整的左most derivation 為:
其中最後一步使用:
第 4 題10 分
Design a Turing Machine that accepts the following language: . (10%)
登入後即可作答並保存紀錄。
此題考驗圖靈機 (Turing Machine, TM) 的設計,用於接受特定語言。
核心觀念:
- 圖靈機 (Turing Machine): 由一組有限的狀態、一個無限長的紙帶(Tape)、一個讀寫頭(Head)和一個轉移函數(Transition Function)組成。
- 接受語言 (Accept Language): 圖靈機接受一個字串,表示該字串在圖靈機執行完畢後,停在一個接受狀態(Accept State)。
- 語言 : 這個語言包含所有以 "ab" 開頭,後面可以跟任意數量的 或 (包括零個)的字串。
例如: "ab", "aba", "abb", "abaa", "abab", "abba", "abbb", ...
圖靈機設計思路:
我們需要設計一個圖靈機,它能夠讀取輸入紙帶,並根據規則判斷輸入字串是否屬於語言 。
圖靈機的紙帶是無限長的,通常用空白符號(Blank, B)填充。紙帶上有一個讀寫頭,可以向左或向右移動,讀取、寫入符號,並根據當前狀態和讀取的符號,決定轉移到哪個新狀態,以及讀寫頭的移動方向。
對於語言 ,我們需要檢查:
- 字串是否以 'a' 開頭。
- 第二個字符是否是 'b'。
- 之後的字符可以是 'a' 或 'b'(任意個數)。
圖靈機的組件:
-
狀態 (States):
- : 初始狀態。
- : 讀到第一個 'a' 後的狀態。
- : 讀到第二個 'b' 後,進入掃描剩餘部分的狀態。
- : 接受狀態。
- : 拒絕狀態(可選,通常通過不進入接受狀態來實現拒絕)。
-
字母表 (Alphabet): (輸入字母表)
-
紙帶字母表 (Tape Alphabet): (B 代表空白符號)
-
起始狀態:
-
接受狀態:
-
轉移函數: (L: Left, R: Right)
設計轉移函數:
-
從 開始:
- 讀到 'a':表示字串的開頭是 'a'。將 'a' 寫回(或保持不變),將頭右移,進入狀態 。
- 讀到 'b' 或 B(空白符號):表示字串不是以 'a' 開頭,不屬於語言 L。進入拒絕狀態(或停機)。
- 讀到 'a':表示字串的開頭是 'a'。將 'a' 寫回(或保持不變),將頭右移,進入狀態 。
-
在 狀態(已讀到第一個 'a'):
- 讀到 'b':表示字串是 "ab..."。將 'b' 寫回,將頭右移,進入狀態 開始掃描剩餘部分。
- 讀到 'a' 或 B:表示字串不是 "ab..."。例如 "aa..." 或 "aB"。不屬於語言 L。
- 讀到 'b':表示字串是 "ab..."。將 'b' 寫回,將頭右移,進入狀態 開始掃描剩餘部分。
-
在 狀態(已讀到 "ab",現在掃描剩餘的 部分):
- 讀到 'a':表示字串是 "aba..."。將 'a' 寫回,將頭右移,繼續停留在 狀態,因為後面還可以跟任意 或 。
- 讀到 'b':表示字串是 "abb..."。將 'b' 寫回,將頭右移,繼續停留在 狀態。
- 讀到 B(空白符號):表示字串以 "ab" 開頭,後面跟著任意數量的 或 (可能是零個),現在紙帶讀到了結尾。這是一個合法的字串。將 B 寫回,將頭右移,進入接受狀態 。
- 讀到 'a':表示字串是 "aba..."。將 'a' 寫回,將頭右移,繼續停留在 狀態,因為後面還可以跟任意 或 。
總結轉移函數:
第 5 題10 分
In RSA algorithm, if and , what are the five smallest possible numbers for ? (10%)
登入後即可作答並保存紀錄。
此題考驗對 RSA 演算法中公鑰指數 的選擇條件的理解。
核心觀念:
- RSA 演算法: 一種公開金鑰密碼學演算法。
- 金鑰產生:
- 選擇兩個大的質數 和 。
- 計算模數 。
- 計算歐拉函數 。
- 選擇一個整數 ,稱為公鑰指數(encryption exponent)。
- 計算 ,稱為私鑰指數(decryption exponent),使得 。
- 公鑰: 。
- 私鑰: 。
- 對 的要求:
- 與 互質 (即 )。
題目給定:
計算步驟:
-
計算模數 :
。 -
計算歐拉函數 :
。 -
尋找滿足條件的 :
我們需要找到滿足以下條件的 :要找出 ,我們需要知道 的質因數。
。
所以, 的質因數是 和 。
為了使 與 互質, 不能包含 或 作為其質因數。也就是說, 不能是偶數,也不能是 的倍數。我們從 開始檢查,找出前五個與 互質且小於 的數:
- : (偶數)
- : (3的倍數)
- : (偶數)
- : (5不是2的倍數,也不是3的倍數)。這是第一個可能的 。
- : (偶數, 3的倍數)
- : (7不是2的倍數,也不是3的倍數)。
第 6 題10 分
Convert the following NFA to a DFA using the subset construction. (10%)
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
本題考查形式語言與自動機理論(Formal Languages and Automata Theory)中的子集合建構法(Subset Construction / Powerset Construction),用於將非確定性有限狀態自動機(NFA)等價轉換為確定性有限狀態自動機(DFA)。
涉及之核心定義與公式如下:
- NFA 與 DFA 之形式定義:
- 給定 NFA 。
- 等價 DFA 定義為 。
- DFA 狀態集合 :
- 每個 DFA 狀態皆為 NFA 狀態集合的子集,即 。
- 起始狀態 :
- 若無 -轉移,則 DFA 起始狀態為單元素集合 。
- 轉移函數 :
- 對於任意 DFA 狀態 及輸入符號 :
- 接受狀態集合 :
- 凡包含 NFA 任一接受狀態的子集,皆為 DFA 的接受狀態:
解題方法
由原卷題圖可知,該 NFA 的狀態集合為 ,輸入字母集為 ;起始狀態為 (由無來源之指向箭號指示),唯一的接受狀態為 (雙圈標示)。圖中不含 -轉移,其轉移函數為:
- ,
- ,
- ,
採用子集合建構法,從起始狀態出發,逐步推導所有可達狀態及其轉移:
步驟 1:確定起始狀態
- DFA 起始狀態為:
- 因 ,故 為非接受狀態。
步驟 2:展開可達狀態之轉移
-
由狀態 出發:
- 輸入 :(產生新狀態)
- 輸入 :
-
由狀態 出發:
- 輸入 :
- 輸入 :(產生新狀態)
-
由狀態 出發:
- 因 ,此狀態為接受狀態。
- 輸入 :(產生新狀態)
- 輸入 :
-
由狀態 出發:
- 因 ,此狀態為接受狀態。
- 輸入 :
- 輸入 :
至此,所有衍生狀態皆已處理完畢,無其他新狀態產生。
步驟 3:建立 DFA 狀態轉移表
第 7 題10 分
Let G be the grammar on the right.
a) Draw the parse tree for the string "xxy" (5%)
b) Can the language of this grammar be captured by a regular expression? If so, give the regular expression. If not, give a short argument why not. (5%)
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 上下文無關文法(Context-Free Grammar, CFG)的推導與語法分析樹。
- 非終結符號透過產生式產生終結符號字串。
- 正規表示式與正規語言的對應。
文法為:
其中 表示空字串。
由 的產生式可知, 能產生任意個 :
因此:
由 的產生式可知, 至少產生一個 :
因此:
解題方法
a) 字串「xxy」的語法分析樹
根據:
目標字串為 ,因此 必須產生兩個 , 產生一個 。
的推導如下:
的推導如下:
完整推導為:
對應的語法分析樹如下:
S
/ \
A B
/ \ \
A x y
/ \
A x
|
λ
由左至右讀取葉節點,忽略空字串 :
第 8 題10 分
What is the output of the following C++ code? (10%)
1 int x = 35;
2 int y = 46;
3 int *p = &x;
4 int *q = &y;
5 *p = 97;
6 p = q;
7 *p = 27;
8 cout << x << " " << y << endl;
9 cout << *p << " " << *q << endl;
登入後即可作答並保存紀錄。
此題考驗 C++ 指標 (pointer) 的操作與記憶體變數值的變化。
核心觀念:
- 指標宣告與初始化:
int *p = &x;表示指標p指向變數x的記憶體位址。 - 指標解參考 (Dereferencing):
*p表示p所指向記憶體位址中的值。 - 指標賦值:
p = q;表示指標p現在指向q所指向的記憶體位址。這改變的是指標p的值(它儲存的位址),而不是p指向的值。 - 變數值的改變: 當指標指向某個變數並透過解參考去修改其值時,該變數的值會被更新。
程式碼執行流程分析:
-
int x = 35;- 宣告整數變數
x,並初始化為 。 - 記憶體狀態:
x = 35
- 宣告整數變數
-
int y = 46;- 宣告整數變數
y,並初始化為 。 - 記憶體狀態:
x = 35,y = 46
- 宣告整數變數
-
int *p = &x;- 宣告整數指標
p。 &x是變數x的記憶體位址。p指向x。- 記憶體狀態:
x = 35,y = 46,p指向x(儲存x的位址)。
- 宣告整數指標
-
int *q = &y;- 宣告整數指標
q。 &y是變數y的記憶體位址。q指向y。- 記憶體狀態:
x = 35,y = 46,p指向x,q指向y。
- 宣告整數指標
第 9 題10 分
The following C program supposes to calculate and print the square root of every second integer number from 1 to 101 inclusive beginning with 1 in two decimal points accuracy. There are syntax or logical errors in this program. For each line that has error(s), state the line number that error(s), and give the correct statement. (10%)
1 #include <stdio.h>
2 #include <math.h>
3
4 int main(void) {
5 double root;
6
7 for (int number = 1; number < 101; number += 2) {
8 number = sqrt((double) root);
9
10 printf("The Square Root of %0.2f is %.1f\n", number, root);
11 }
12 return (EXIT_DENIED);
13 }
登入後即可作答並保存紀錄。
核心觀念
本題考查:
for迴圈的初始值、終止條件與遞增方式。- 變數初始化與指定運算。
sqrt()函式的使用。printf()格式指定字串與變數型別的配合。main()的正常結束回傳值。- 迴圈執行次數與時間、空間複雜度。
題目要求處理從 到 ,每隔一個整數取一次,故輸入序列為:
共有
個整數,並將每個整數的平方根以小數點後兩位印出。
解題方法
逐行檢查程式,確認三件事:
- 迴圈是否涵蓋正確的數值範圍。
- 平方根是否存入正確變數。
printf()的格式是否符合參數型別與輸出精度。
第 7 行
原程式:
for (int number = 1; number < 101; number += 2) {
number < 101 會在 number 等於 時停止,因此不會處理 。題目要求包含 ,終止條件必須改為 number <= 101。
正確敘述:
for (int number = 1; number <= 101; number += 2) {
第 8 行
原程式:
number = sqrt((double) root);
此行有兩個問題:
root尚未初始化,直接使用會產生未定義行為。- 平方根結果應存入
root,不能覆寫迴圈控制變數number。
正確做法是以目前的 number 計算平方根:
root = sqrt((double) number);
number 是整數,轉成 double 後傳給 sqrt(),結果存入 double 型別的 root。
第 10 行
原程式:
printf("The Square Root of %0.2f is %.1f\n", number, root);
此行有兩項錯誤:
number是int,不能使用%f。整數應使用%d。%.1f只會輸出小數點後一位,題目要求小數點後兩位,應改為%.2f。
正確敘述:
printf("The Square Root of %d is %.2f\n", number, root);
第 12 行
原程式:
第 10 題10 分
Show the values of registers R0 and R1 after the each of the instructions in the assembly code below. (10%)
1 MOV R0, #11
2 MOV R1, #13
3 EOR RO, RO, R1
4 EOR R1, R0, R1
5 EOR RO, RO, R1
登入後即可作答並保存紀錄。
此題考驗對組合語言 (Assembly Language) 中邏輯運算指令 EOR (Exclusive OR) 的理解,以及暫存器 (Register) 值的變化。
核心觀念:
- 暫存器 (Registers): CPU 中用來暫存資料的小型高速記憶體。
- MOV 指令: 將一個值或暫存器的內容複製到另一個暫存器。
- EOR 指令 (Exclusive OR): 對兩個操作數進行按位元 XOR 運算,結果存入第一個操作數(目標暫存器)。
- XOR 的規則:
- XOR 的特性:
- (與 0 XOR 保持不變)
- (與自身 XOR 變為 0)
- (交換律)
- (結合律)
- 一個常見用法是交換兩個變數的值,而無需臨時變數:
XOR R1, R2(R1 = R1 XOR R2)
XOR R2, R1(R2 = R2 XOR (R1 XOR R2) = R1)
XOR R1, R2(R1 = (R1 XOR R2) XOR R1 = R2)
- XOR 的規則:
程式碼執行流程分析:
我們將追蹤 R0 和 R1 在每一條指令執行後的數值。
為了方便計算,我們將十進位數轉換為二進位。
(假設使用 4 位元來簡化,實際 CPU 可能是 32 或 64 位元)
初始狀態:
(假設指令執行前 R0 和 R1 的值未知,但第一、二條指令會初始化它們)
-
MOV R0, #11- 將立即數 載入暫存器
R0。 - R0: ()
- R1: (未知,但在下一條指令後會設定)
- 將立即數 載入暫存器
-
MOV R1, #13- 將立即數 載入暫存器
R1。 - R0: ()
- R1: ()
- 將立即數 載入暫存器
-
EOR R0, R0, R1- 計算
R0XORR1,結果存入R0。 R0 = R0 \oplus R1-
1011 (R0) ⊕ 1101 (R1) ------ 0110 (New R0) - 。
- R0: ()
- R1: ()
- 計算
-
EOR R1, R0, R1- 計算
R0XORR1,結果存入R1。 R1 = R0 \oplus R1-
0110 (R0) ⊕ 1101 (R1) ------ 1011 (New R1) - 。
- R0: ()
- R1: ()
- 注意: 經過這一步,
R1的值變回了初始的 。
- 計算