APCS 105-10-29 觀念題解析

by Sean, Jun 2018

題目連結

1

此題並沒有涉及任何交換,直接追蹤 a=2, b=3 的情況
a=2
c=a=2
t=item[2]=3
b=3
item[3]=1 < t=3 成立
c=b=3
t=item[3]=1
printf("%c %d\n",t,c) → 1 3

2

x=10,y=‘a’,停住
x=20,沒有 break,繼續往下走,y=‘b’,停住
x=30,y=‘b’,停住
其他狀況,y=‘c’
因此可知

if(x==10){ y='a'; }else if(x==20 || x==30){ y='b'; }else{ y='c'; }

3

G(3)=K(a,3)
K(a,3)=K(a,2)+a[3]=K(a,2)+2
K(a,2)=K(a,1)+a[2]=K(a,1)+3
K(a,1)=K(a,0)+a[1]=K(a,0)+4
K(a,0)=K(a,-1)+a[0]=K(a,-1)+5
K(a,-1)=0,開始 return
K(a,0)=5
K(a,1)=9
K(a,2)=12
K(a,3)=14
G(3)=14

4

因為都是整數,小數部份會直接捨去
b/a=3/2=1, c/b=4/3=1, d/b=5/3=1
val=1+1+1=3

5

第一個迴圈的 i<n/2 部份是將第 x 個元素與倒數第 x 個元素互換
但是後半部又會將牠們換回來,也就是這個迴圈做了白工
第二個迴圈則是依 x,倒數第 x… 這樣的順序輸出
所以答案為 1 2 3 4 5 6 7 8 9 9

6

7

i = 1 n n = n n ( n + 1 ) 2 = n 2 ( n + 1 ) 2

8

二分搜尋法只適用於已排序的對象,B 為無序

9

70~79 和 60 是錯的,共 11 個

10

11

中間九格的四個鄰居的和

12

13

char array 未被指派的位置,系統會指派 0,也就是 \0

14

15

-(a[0] ~ a[7])
+(a[1] ~ a[8])
+(a[2] ~ a[9])

= -a[0]+a[8]+a[2] ~ a[9]

= 0+8+44=52

16

a_ptr 存放的值是 &a,對 int 取址,為 int*
a_ptrptr 存放的值是 &a_ptr,對 int* 取址,為 int**

17

觀察第一行,i=0,k 從 6-2*0=6 開始遞減,執行 6 次,故條件為 k>0

18

G(1)
= print(1)
= G(2)
== print(2)
== G(3)
=== print(3)
=== return
== print(2)
= print(1)

故為 1 2 3 2 1

19

任何數 %1 都是0,而且都已經找完錢了,沒意義,選 D

20

A=G(5)=25
A=G(5)+A=25+25=50

21

22

13 16 3 + 2 16 1 + 10 + 5487 = 4096 13 + 512 + 10 + 5487 = 58777

但這樣硬算很智障,較快的解法是將題目的 5487 轉成 16 進位的 156F
156F+D02A=E599
再把它轉成二進位,每個 16 進位的位數代表 4 個 bit
E=1110,5=0101,9=1001
所以我們要找出二進位為 1110 0101 1001 1001 的值

23

65536=2^16

此時可以發現,題目要問的就是 x=3+ceil(log(3,16))=3+3=6

24

經典的遞迴,算次方。 3 7 = 2187

25

這題有小 bug,照理說 int/int 會捨去小數
但這題必須用小數去看待 int/int 的結果,再無條件進位

search(1,10,3)

t=6
search(1,5,3)

t=3
search(3,5,3)

t=4
search(3,3,3)
共 4 次