1
「程式能力檢定」考古題—2017 年版
1. 請寫一個程式,從資料檔(a.txt)讀入一個正整數,把它的所有質因數找出來。例如:如果
輸入是 72,因為 72=2
3
×3
2
,於是質因數就有 2 與 3,如果輸入是 181944,因為 181944=19
2
×7×3
2
×2
3
,於是質因數就有 19,7,3 與 2。為方便起見,19
2
×7×3
2
×2
3
,使用 19(2)7(1)3(2)2(3)
作輸出。也就是說,a
b
輸出為 a(b)。
範例輸入:
181944
範例輸出:
181944
Ans=19(2)7(1)3(2)2(3)
2. 對於一個字串若起始字元為 A,最後字元為 L,且其間不含任何 A 或 L 字元則稱 AL 字
串。
例: A PENCIL 或 A XXBBHCL (四方形表示空白字元)
請設計一程式能從資料檔 b.txt 讀入一個字串(不超過 200 個字元),然後消去所有可能
的 AL 字串,使得消去後之輸出不包含 AL 字串。
範例輸入:
This is a ball
範例輸出:
This is a ball
Ans=This is
3. 從檔案(c.txt)讀入一算術四則運算式,計算並列印其結果。
(1)運算式包含+-*/四則算術運算
(2)輸入數字可能包含小數點
(3)不分+-*/一律由左而右依序計算
(4)運算式的最後結果依四捨五入後取整數值
以下幾個範例可供參考測試之:
範例輸入一:
15*3/8*10/3=
範例輸出一:
15*3/8*10/3=19
範例輸入二:
6.53*5+3-8=
範例輸出二:
6.53*5+3-8=28
4. 請從資料檔 d.txt 讀入好幾行字串資料,字串資料是由字元(‘a’~’z’,’A’~’Z’)、數字(‘0’~’9’)
以及空白字元所構成的,接著將字串中這些由字元或者空白隔開的數字部分進行加總
(54+256+72+125+56+22+66=751),並且將原字串以及結果輸出。
範例輸入:
Cyut54is a356good 72school
Ne125ver 56give22 66up
第一次消去 AL 字串得到 This is a bl
第二次消去 AL 字串得到 This is
2
計算方法:54+356+72+125+56+22+66=751
範例輸出:
Cyut54is a356good 72school
Ne125ver 56give22 66up
Ans=751
5. 試寫一程式,從檔案 e.txt 讀入一串整數,計算出此串整數中某部分連續整數和為最大值,
並由螢幕輸出。
範例輸入:
1 2 -6 3 -2 4 -1 3 2 -4
計算方法:最大值是 3+(-2)+4+(-1)+3+2=9
範例輸出:
1 2 -6 3 -2 4 -1 3 2 -4
Ans=9
6. 試寫一程式,從檔案(4.dat)讀入一串正整數(最多 10 個),試找出此串正整數之最大公因
數。例如:
範例輸入:
12 16 36 128
範例輸出:
12 16 36 128
Ans=1152
7. 請寫一程式,此程式從 b.txt 中讀取一個正的十進位數字(含小數)後將此十進位數字轉換
成二進位數字,轉換後的數字請取至小數點第三位(小數點第三位以後的數字直接捨去)。
輸出格式為:轉換後的整數+轉換後的小數部分
範例輸入:
21.33
說明:
21.33 轉換成二進位數字為 10101.010101…
取小數點後三位後的數字為 10101.010
因此輸出結果為 10101+010
範例輸出:
21.33
Ans=10101+010
8. 橢圓的公式為
0
=
+
+
α
BX
AX
X
T
,若空間上一個點落於此橢圓內將符合
0
≤
+
+
α
BX
AX
X
T
,反之則落於此橢圓外。應用此公式在三維 xyz 的空間時,
=
z
y
x
X
,
=
33
32
31
23
22
21
13
12
11
a
a
a
a
a
a
a
a
a
A
,
[
]
3
2
1
b
b
b
B
=
。假設已知
=
9
2
1
5
9
2
3
1
4
A
,
[
]
18
45
16
−
−
=
B
且
α=36,請撰寫程式可以從資料檔 c.txt 讀入三個整數後,接著計算
α
+
+ BX
AX
X
T
的結
3
果,最後輸出這三個整數以及計算的結果。
範例輸入:
2 -5 3
範例輸出:上面輸入表示要計算
[
]
[
]
36
3
5
2
18
45
16
3
5
2
9
2
1
5
9
2
3
1
4
3
5
2
+
−
−
−
+
−
−
2 -5 3
Ans=-64
9. 一個完美數(perfect number)是指一個正整數 N,N 所有的因數(包含 1,但不包含 N)的
總和恰好等於 N,則 N 稱為完美數,例如:6 是一個 perfect number,因為 6 的因數 1, 2,
3 的總和恰巧等於 6。數字 28 是另一個 perfect number,28 的因數 1+2+4+7+14,也剛好
等於 28。請從資料檔 b.txt 中讀入一個正整數 N,然後輸出一個小於等於 N,且最接近
N 的 perfect number。
範例輸入:
30
範例輸出:
30
Ans=28
10. 分別自檔案 e.txt 讀入一串由()[]{}所組成之字串,判斷字串是否合法,一個()[]{}必須對
稱存在,且對應的括號間不能插入單獨的括號。
範例輸入一:
({[()]()})
範例輸出一:
({[()]()})
Ans=CORRECT
範例輸入二:
(){[()]()
範例輸出二:
(){[()]()
Ans=ERROR
11. 中國餘數定理最早記載於第一世紀之孫子算經中,其原題目為:今有物不知其數,三三
數之剩二,五五數之剩三,七七數之剩二,問物幾何?
其計算過程如下:
1.
首先計算所有質數的乘積 -> N=3*5*7=105
2.
計算 N 除以每個質數的商 -> 105/3=35, 105/5=21, 105/7=15
3.
計算這個商的倍數值,使得對原質數取餘數的結果為 1
35*y
1
mod 3=1
得到 y
1
=2
21*y
2
mod 5=1
得到 y
2
=1
15*y
3
mod 7=1
得到 y
3
=1
4.
答案 x 等於每個質數的商、倍數值、餘數三者乘積的總和 mod 原來質數的乘積
x=35*2*2+21*1*3+15*1*2 mod 105=23
4
請撰寫一個程式從資料檔 e.txt 依序讀入幾個質數(不一定只有三個質數)與對應的
餘數,然後輸出解答。
範例輸入:
3 2 5 3 7 2
範例輸出:
3 2 5 3 7 2
Ans=23
12. 雜湊(hashing)是用來計算一個鍵值(key value)對應之索引(index)的方法,而「折疊法」是
雜湊函數的方法之一,假設有一個鍵值為 5120969190600791,而折疊的長度為 3,折疊
的計算過程如下,首先鍵值先依照折疊長度加以切割,由於鍵值有 16 個數字,每 3 個數
字進行切割的話,可以切出 6 段,如下所示:
512 096 919 060 079 1
接著這些數值進行加總就可以得到所需要的索引 1667,如下所示:
512+096+919+060+079+1=1667
所以請撰寫一個程式從 b.txt 中讀入兩行資料,第一行是鍵值的字串,第二行是折疊的長
度,接著輸出索引的結果。
範例輸入:
5120969190600791
3
範例輸出:
5120969190600791
3
Ans=1667
13. 西元 2013 年的 1 月 1 日為星期二,請撰寫程式從資料檔 c.txt 讀入兩個數字(中間以空
格區分),分別代表哪一個月的哪一天,接著算出此日期在 2013 年中為星期幾,最後將
星期幾以數字輸出,星期日為 0,星期一為 1,星期二為 2,以此類推。
範例輸入一:
3 14
範例輸出一:
3 14
Ans=4
範例輸入二:
12 7
範例輸出二:
12 7
Ans=6
14. 身份證號碼的最後一碼為檢查碼,用於確認號碼是否正確,此檢查碼運算規則如下:
1.
英文代號先以下表轉換成數字
A=10 B=11 C=12 D=13 E=14 F=15 G=16 H=17 I=34
J=18 K=19 L=20 M=21 N=22 O=35 P=23 Q=24 R=25
S=26 T=27 U=28 V=29 W=32 X=30 Y=31 Z=33
2.
英文轉成的數字,個位數乘 9 再加上十位數
3.
各數字從右到左依次乘 1,2,3,4,5,6,7,8
5
4.
計算上面兩項的總和,計算總和除 10 後之餘數,再用 10 減該餘數,結果就是檢查
碼,若餘數為 0,檢查碼就是 0。
舉例來說:身分證號碼是 W100232736, 身份證號碼的前 9 個字元為 W10023273
W
1 0 0 2 3 2 7 3
3 2
* * * * * * * * * *
1 9 8 7 6 5 4 3 2 1
────────────────
3+18+8+0+0+10+12+6+14+3=74
74/10=7....4 (
餘數)
10-4=6 (
檢查碼)
請撰寫一個程式從資料檔 c.txt 讀入一個身份證號碼的前 9 個字元,然後輸出檢查碼。
範例輸入:
W10023273
範例輸出:
W10023273
6
15. 請撰寫一個程式從檔案 e.txt 中讀入二個正整數 n 與 k(n
≤100000000),接著輸出 0~n
的數值中,每個數字總合為 k 的個數。
範例輸入:
100 5
表示要從 0~100 中找出數字總合為 5 的數值個數,這些數值有:
5
14
(因為 1 + 4 = 5)
23
(因為 2 + 3 = 5)
32
(因為 3 + 2 = 5)
41
(因為 4 + 1 = 5)
50
(因為 5 + 0 = 5)
範例輸出:
100 5
Ans=6
16. 儲蓄是一種美德,目前常見的儲蓄方式為定時存款,整筆領回,利率採每年複利的方式
計算。例如:每年存 100000,存 3 年,若是複利率為 2.25%,3 年後的本利和如下:
第一年初存入 100000,本金=100000
第二年初,前一年本利=100000*(1+2.25%)=102250,加上存入的 100000,合計 202250
第三年初,前一年本利=202250*(1+2.25%)=206801,加上存入的 100000,合計 306801
第三年尾合計領回的本利和=306801*(1+2.25%)=313704
請寫一個程式從資料檔 a.txt 中讀入三行資料,第一行是每年存款的金額,第二行是存款
年數,第三行是本利和,接著反算出存款複利率為何(請計算到小數點後兩位)
。
範例輸入:
100000
3
313704
範例輸出:
100000
6
3
313704
Ans=2.25%
17. Quoted-Printable 是寄送郵件的時候常常使用的編碼格式,其編碼的原則是將中文
字的兩個 Bytes 編成一般的 ASCII,比如說:”我”的是由 A7DA (十六進制)這兩個
Bytes
所構成,其中 A7 的十進位值(10*16+7 )超過 127 所以在 A7 前面加上一個等
號(=),編成=A7, 相同地,DA 的十進制值也超過 127 所以被編成=DA,最後中文字”
我”就被編成=A7=DA。另外,”愛”兩個位元組為 B752 其中,B7 換成十進位時超過 127
所以編成=B7,而 52 轉成十進制值小於 127,所以直接以 52 的 ASCII 的字元來表示,
也就是 R 所以, “愛”就被編成 =B7R。請撰寫一個程式從檔案 d.txt 中讀入一連串編
碼過的資料,輸出原來未編碼的數值,亦即這串資料所表示的中文字串。
範例輸入:
=B4=C2=B6=A7=AC=EC=A4j
範例輸出:
=B4=C2=B6=A7=AC=EC=A4j
Ans=朝陽科大
18. 閏年的規則為每三年後第
4 年的 2 月為 29 日,請由檔案 d.txt 中讀入一個日期,格式
為
(西元制年 月 日,且年度範圍為 1900 1 月 1 日至 2100 12 月 31 日)請先判斷日期是否
合法?如果合法請輸出此日期為星期幾?
(可以使用今天為基準來進行推算)
(Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)
範例輸入一:
1988 9 32
範例輸出一:
1988 9 32
Ans=Error
範例輸入二:
2002 11 10
範例輸出二:
2002 11 10
Ans=Sunday
19. 部分序列字串指原字串中刪掉一個以上字元且不改變原順序的部份字串。請撰寫程式從
資料檔 d.txt 讀入兩個字串(每一字串皆不超過 50 字元),判斷第一個字串是否為第二個字
串的部份序列字串,若是則輸出 Yes 以及被刪除之部分序列字串,否則輸出 No。
範例輸入一:
bcfg gcbgcefgjvk
範例輸出一:
bcfg gcbgcefgjvk
Ans=Yes gcgejvk
範例輸入二:
bcfg gcagcefgjvk
範例輸出二:
bcfg gcagcefgjvk
7
Ans=No
20. 蓋倫是蒂瑪西亞學院裡資工系的助教,當同學把程式作業寫好送上來之後,除了要確認
程式是否能夠成功執行之外,還要確認程式碼是否有抄襲。假設今天學生嘉文四世與學
生拉克絲的程式碼相同,學生拉克絲與學生趙信的程式碼相同,那蓋倫就可以知道說學
生三人使用同一份程式碼當作業。你的任務就是要幫蓋倫找出抄襲同一份程式碼的學生
數量,且學生數量要最多。
輸入說明 :
輸入檔 e.txt 內含兩列,第一列有兩個整數 m, n ,代表有 m 個同學(0 < m <= 14)且以英
文字母 A、B、C 表示)以及有 n 組( 0 < n <= 30 )已經發現的抄襲作業。第二列為 n 組
已經發現的抄襲作業的資料,每組資料型式如(A,B),代表 A 同學和 B 同學的作業相同。
範例輸入一:
3,3
(A,B)(A,C)(B,C)
範例輸出一:
3,3
(A,B)(A,C)(B,C)
Ans=3
範例輸入二:
6,5
(A,B)(A,C)(B,D)(C,D)(E,F)
範例輸出二:
6,5
(A,B)(A,C)(B,D)(C,D)(E,F)
Ans=4
21. 猜數字:請撰寫一個程式從 a.txt 中讀入兩個數字字串(長度最長為 10 且數字不重複)
,
並且判斷字串中的每個數字,若是兩個字串在同一個位置的數字都相同,則記載一個 A,
若是兩個字串都有這個數字但是位置不同,則記載一個 B,當沒有 A 也沒有 B 時則輸出
0A0B,底下是輸入的範例:
14685
47653
輸出結果:
14685
47653
Ans=1A2B
22. 排序:請針對 b.txt 中的資料進行排序,並依題意由大至小或由小至大將排序結果印出,
排序方式不限,排序後的資料間以一個空白間格分隔。
輸入檔說明:
輸入檔中包含兩行文字,第一行的數字為 0 或 1。0 代表輸出結果由小至大排列,1 則
代表輸出結果由大至小排列。第二行則包含欲排序的數字,每個數字均為整數,數字個
數不超過 100 個,每個數字間以空白間隔。
範例輸入:
0
3 2 5 7 8 1
8
範例輸出:
0
3 2 5 7 8 1
Ans=1 2 3 5 7 8
23. 數學大師歐勒找到了一個圓周率的無窮乘積計算式,如下所示:
×
×
×
×
×
×
×
×
=
22
23
18
19
18
17
14
13
10
11
6
7
6
5
2
3
2
π
在這個公式內所有的分子都是大於 2 的質數,分母則是不能被 4 整除且最靠近分子的偶
數。請撰寫一個程式,可以從資料檔 c.txt 中讀入一個正整數 n 後,接著分別列出上面式
子到第 n 項的分子與分母的乘積運算式,第一行輸出分子的乘積運算式,第二行輸出分
母的乘積運算式。
範例輸入一:
5
範例輸出一:
5
3*5*7*11*13
2*6*6*10*14
範例輸入二:
8
範例輸出二:
8
3*5*7*11*13*17*19*23
2*6*6*10*14*18*18*22
24. 請從資料檔 d.txt 讀入兩個數字 x 及 n 後計算下面運算式的結果:
!
!
3
!
2
!
1
!
3
2
1
1
n
x
x
x
x
k
x
n
n
k
k
+
+
+
+
=
∑
=
輸出結果時只需要輸出整數部分,小數點後的結果無條件捨去。
範例輸入:
5
8
計算方法:
3072
.
137
!
8
5
!
7
5
!
6
5
!
5
5
!
4
5
!
3
5
!
2
5
!
1
5
!
5
8
7
6
5
4
3
2
1
8
1
=
+
+
+
+
+
+
+
=
∑
=
k
k
k
範例輸出:
5
8
Ans=137
25. 雞兔同籠:有一個籠子裡裝了若干的雞和兔,數一數他們的頭,一共有 15 顆頭,數一數
他們的腳,一共有 42 隻腳,請問雞和兔各有多少隻呢?
透過簡單的代數計算可以得知雞有 9 隻,兔子有 6 隻,他們的腳一共是:
9*2+6*4=18+24=42
請撰寫一個程式,可以從資料檔 e.txt 中讀入四個數字,分別表示第一種動物的腳數、第
二種動物的腳數、頭的總數與腳的總數,然後輸出第一種動物的數目以及第二種動物的
數目,若是解答不存在的話則輸出 No Solution。
9
範例輸入一:(第一種動物 2 隻腳,第二種動物 4 隻腳,頭一共 15 個,腳一共 42 隻)
2 4 15 42
範例輸出一:
2 4 15 42
Ans=9 6
範例輸入二:(第一種動物 2 隻腳,第二種動物 4 隻腳,頭一共 10 個,腳一共 42 隻)
2 4 10 42
範例輸出二:
(注意:No Solution 的字串請與題目說明完全一致,以避免驗證失敗)
2 4 10 42
Ans=No Solution