「程式能力檢定」考古題
題目難易標示:S: Simple, M: Medium, D: Difficult
1. S 請寫一個程式,從資料檔(a.txt)讀入一個正整數,把它的所有質因數找出來。
例如:如果輸入是 72,因為 72=23×32,於是質因數就有 2 與 3,如果輸入是 181944,
因為 181944=192×7×32×23,於是質因數就有 19,7,3 與 2。為方便起見,192×7×32× 23,使用 19(2)7(1)3(2)2(3)作輸出。也就是說,ab 輸出為 a(b)。
範例輸入:
181944 範例輸出:
181944
Ans=19(2)7(1)3(2)2(3)
2. S 對於一個字串若起始字元為 A,最後字元為 L,且其間不含任何 A 或 L 字元則稱 AL字串。
例: APENCIL 或 AXXBBHCL (四方形表示空白字元)
請設計一程式能從資料檔 b.txt 讀入一個字串(不超過 200 個字元),然後消去所 有可能的 AL 字串,使得消去後之輸出不包含 AL 字串。
範例輸入:
This is a ball 範例輸出:
This is a ball Ans=This is
3. M 從檔案(c.txt)讀入一算術四則運算式,計算並列印其結果。
(1)運算式包含+-*/四則算術運算 (2)輸入數字可能包含小數點 (3)不分+-*/一律由左而右依序計算
(4)運算式的最後結果依四捨五入後取整數值 以下幾個範例可供參考測試之:
範例輸入一:
15*3/8*10/3=
範例輸出一:
15*3/8*10/3=19 範例輸入二:
6.53*5+3-8=
範例輸出二:
第一次消去 AL 字串得到 Thisisabl 第二次消去 AL 字串得到 Thisis
6.53*5+3-8=28
4. S 請從資料檔 d.txt 讀入好幾行字串資料,字串資料是由字元
(‘a’~’z’,’A’~’Z’)、數字(‘0’~’9’)以及空白字元所構成的,接著將字串中這 些由字元或者空白隔開的數字部分進行加總(54+256+72+125+56+22+66=751),並且 將原字串以及結果輸出。
範例輸入:
Cyut54is a356good 72school Ne125ver 56give22 66up
計算方法:54+356+72+125+56+22+66=751 範例輸出:
Cyut54is a356good 72school Ne125ver 56give22 66up Ans=751
5. S 試寫一程式,從檔案 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. M 有一運算式,其運算規則為(運算子,運算元,運算元)。例如(*,3,5)表示 3*5,
結果等於 15。運算子可為+,-,*,/,運算元則是一個正或負整數,若有多重括弧,
則以內部括弧先處理。請設計一個程式可以從資料檔 a.txt 讀入一個運算式,並輸 出結果。
範例輸入:
(+,(*,3,5),(-,(*,2,4),6)) 範例輸出:
(+,(*,3,5),(-,(*,2,4),6)) Ans=17
7. S 試寫一程式,從檔案 b.txt 讀入一串正整數,試找出此串正整數之最小公倍數。
例如:
範例輸入:
12 16 36 128 範例輸出:
12 16 36 128
Ans=1152
8. S 橢圓的公式為XTAX BX
0,若空間上一個點落於此橢圓內將符合0
BX
AXXT ,反之則落於此橢圓外。應用此公式在三維 xyz 的空間時,
z y x
X
,
33 32 31
23 22 21
13 12 11
a a a
a a a
a a a
A
,B
b
1b
2b
3
。假設已知
9 2 1
5 9 2
3 1 4
A
,
16 45 18
B
且α=36,請撰寫程式可以從資料檔 c.txt 讀入三個整數後,接 著計算XTAX BX
的結果,最後輸出這三個整數以及計算的結果。範例輸入:
2 -5 3
範例輸出:上面輸入表示要計算
363 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. M 閏年的規則為每三年後第 4 年的 2 月為 29 日,請由檔案 d.txt 中讀入一個日 期,格式為(西元制年 月 日,且年度範圍為 1900 1 月 1 日至 2100 12 月 31 日)請先 判斷日期是否合法?如果合法請輸出此日期為星期幾?(可以使用 2003 7 9 星期三為 基準前後來推算) (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday) 範例輸入一:
1988 9 32 範例輸出一:
1988 9 32 Ans=Error 範例輸入二:
2002 11 10 範例輸出二:
2002 11 10 Ans=Sunday
10. S 分別自檔案 e.txt 讀入一串由()[]{}所組成之字串,判斷字串是否合法,一個 ()[]{}必須對稱存在,且對應的括號間不能插入單獨的括號。
範例輸入一:
({[()]()}) 範例輸出一:
({[()]()}) Ans=CORRECT 範例輸入二:
(){[()]() 範例輸出二:
(){[()]() Ans=ERROR
11. M 請設計一個程式來計算兩個分數的+、-、*、/(加、減、乘、除)算術運算。規則:
(1)輸入的數值資料為整數資料,其運算結果為分數的部份必須化簡為最簡分數。
(例如:-1/2+1/4=-2/8 化簡為-1/4)
(2)若運算結果有包含正整數 n,則表示為 n+,若為負整數,則表示為-n-。
例如:5/6+1/2=1+1/3 例如:-5/6-1/2=-1-1/3 範例輸入:資料檔(d.txt):
1/4+-1/2 範例輸出:
1/4+-1/2 Ans=-1/4
12. S 雜湊(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. S 公共電話或者大哥大的按鍵上都有對應的英文字,如下所示:
號碼 字元
2 A B C
3 D E F
4 G H I
5 J K L
6 M N O
7 P Q R S
8 T U V
9 W X Y Z
剛開始這樣的設計是為了讓人們方便記住一個號碼,例如: “HURRYUP”表示的號 碼為 “4877987”,記住“HURRYUP”比記住“4877987”容易的多。
請撰寫一個程式,可以從檔案 c.txt 中讀入一串由大寫 A~Z 所組成的文字(長度 不限),接著將這串文字依照上面的對照表進行轉換,然後輸出對應的這一串數字。
範例輸入:
HURRYUP 範例輸出:
HURRYUP Ans=4877987
14. M 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 中讀入一連串編碼過的資料,輸出原來未編碼的數值,亦即這 串資料所表示的中文字串。
範例輸入:
=A6=D1=AEv=B1z=A6n 範例輸出:
=A6=D1=AEv=B1z=A6n Ans=老師您好
15. S 請撰寫一個程式從檔案 e.txt 中讀入二個正整數 n 與 k,接著輸出 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. M 儲蓄是一種美德,目前常見的儲蓄方式為定時存款,整筆領回,利率採每年複利 的方式計算。例如:每年存 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 3
313704 Ans=2.25%
17. M 假設 A 為一個33的矩陣,且假設 A 的反矩陣一定存在,今依序輸入矩陣的第一 列、第二列與第三列資料後請使用 Gauss-Jordan Elimination 求出此矩陣的反矩陣內 所有元素總合(最後加總後若含小數點部分請無條件捨去)。
範例輸入:(資料檔 b.txt) 1 -1 -2 2 -3 -5 -1 3 5
上面的輸入代表
5 3 1
5 3 2
2 1 1
A
在下面的運算中,R1、R2、R3 分別代表下方矩陣[A:I3]中第一列、第二列、第三 列的資料,運算過程中使用的運算式,例如:R2+(-2)R1 代表將第一列的元素都乘 以(-2)後加上第二列的資料,一連串的運算的主要目的是將矩陣 A 變成原本的 I3, 這時原來的 I3部分就是我們所要求出的反矩陣 A-1。
1 2 3
1 3 5
1 1 0
1 2 3
1 3 5
1 1 0
1 0 0
0 1 0
0 0 1 3 1 2
3 1
1 2 3 1 0 0
0 1 2 1 1 0
0 1 3 1 0 1
2 2 3
2 1
1 0 1 3 2 0
0 1 2 1 1 0
0 0 1 2 1 1 2 1
1 0 1 3 2 0
0 1 2 1 1 0
0 0 1 2 1 1
1 3
1 2 2 1 0 0
0 1 0
0 0 1
5 3 1
5 3 2
2 1 1 :
1 3
A R
R R R
R R
R R R
R R
R R
I A
因此,反矩陣 A-1內所有元素總合為: 0+1+1+5+(-3)+(-1)+(-3)+2+1=3 範例輸出:
1 -1 -2 2 -3 -5 -1 3 5 Ans=3
18. S 身份證號碼的最後一碼為檢查碼,用於確認號碼是否正確,此檢查碼運算規則如 下:
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
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 範例輸出:
W100232736
19. M 部分序列字串指原字串中刪掉一個以上字元且不改變原順序的部份字串。請撰寫 程式從資料檔 d.txt 讀入兩個字串(每一字串皆不超過 50 字元),判斷第一個字串 是否為第二個字串的部份序列字串,若是則輸出 Yes 以及被刪除之部分序列字串,
否則輸出 No。
範例輸入一:
bcfg gcbgcefgjvk 範例輸出一:
bcfg gcbgcefgjvk Ans=Yes gcgejvk 範例輸入二:
bcfg gcagcefgjvk 範例輸出二:
bcfg gcagcefgjvk Ans=No
20. S 中國餘數定理最早記載於第一世紀之孫子算經中,其原題目為:今有物不知其數,
三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?
其計算過程如下:
1.首先計算所有質數的乘積 -> N=3*5*7=105
2.計算 N 除以每個質數的商 -> 105/3=35, 105/5=21, 105/7=15 3.計算這個商的倍數值,使得對原質數取餘數的結果為 1
35*y1 mod 3=1 得到 y1=2 21*y2 mod 5=1 得到 y2=1 15*y3 mod 7=1 得到 y3=1
4.答案 x 等於每個質數的商、倍數值、餘數三者乘積的總和 mod 原來質數的乘積
x=35*2*2+21*1*3+15*1*2 mod 105=23
請撰寫一個程式從資料檔 e.txt 依序讀入幾個質數(不一定只有三個質數)與對
應的餘數,然後輸出解答。
範例輸入:
3 2 5 3 7 2 範例輸出:
3 2 5 3 7 2 Ans=23
21. S 猜數字:請撰寫一個程式從 a.txt 中讀入兩個數字字串(長度最長為 10 且數字 不重複),並且判斷字串中的每個數字,若是兩個字串在同一個位置的數字都相同,
則記載一個 A,若是兩個字串都有這個數字但是位置不同,則記載一個 B,當沒有 A 也沒有 B 時則輸出 0A0B,底下是輸入的範例:
14685 47653 輸出結果:
14685 47653 Ans=1A2B
22. S 一個完美數(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
23. S 數學大師歐勒找到了一個圓周率的無窮乘積計算式,如下所示:
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. S 請從資料檔 d.txt 讀入兩個數字 x 及 n 後計算下面運算式的結果:
!
! 3
! 2
! 1
!
3 2 1
1
k
x x
x x k
x
kn
k
k
輸出結果時只需要輸出整數部分,小數點後的結果無條件捨去。
範例輸入:
5 8
計算方法: 137.3072
! 8 5
! 7 5
! 6 5
! 5 5
! 4 5
! 3 5
! 2 5
! 1 5
!
5 1 2 3 4 5 6 7 8
8
1
k
k
k
範例輸出:5 8
Ans=137
25. S 雞兔同籠:有一個籠子裡裝了若干的雞和兔,數一數他們的頭,一共有 15 顆頭,
數一數他們的腳,一共有 42 隻腳,請問雞和兔各有多少隻呢?
透過簡單的代數計算可以得知雞有 9 隻,兔子有 6 隻,他們的腳一共是:
9*2+6*4=18+24=42
請撰寫一個程式,可以從資料檔 e.txt 中讀入四個數字,分別表示第一種動物的 腳數、第二種動物的腳數、頭的總數與腳的總數,然後輸出第一種動物的數目以及 第二種動物的數目,若是解答不存在的話則輸出 No Solution。
範例輸入一:(第一種動物 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