111年地方特考三等程式設計
一、有關 C 程式設計,回答下列問題: (一)下列程式執行結果為何?(13分) (二)下列程式執行結果為何?(10分) |
答:
(一)
#include <stdio.h> int func1(int a, int b) { printf("%3d %3d\n", a, b); if (b == 0) return a; else if (a%2 && b%2) return func1((a+b)/2, (a-b)/2); else if (a%2 && !b%2) return func1(a, b/2); else if (!a%2 && b%2) return func1(a/2, b); else return 2*func1(a/2, b/2); } int main(void) { int x = 19, y = 2; printf("%3d", func1(x, y)); } |
執行結果:
19 2
9 1
5 4
2 2
1 1
1 0
8
說明:
print 19 2
func1(19, 2)
19%2 = 9 … 1, 2%2 = 1 … 0
2*func1(a/2, b/2) = 2*func1(19/2, 2/2) = 2*func1(9, 1)
print 9 1
9%2 = 4 … 1, 1%2 = 0 … 1
func1((a+b)/2, (a-b)/2) = func1((9+1)/2, (9-1)/2) = func1(5, 4)
print 5 4
5%2 = 2 … 1, 4%2 = 2 … 0
2*func1(a/2, b/2) = 2*func1(5/2, 4/2) = 2*func1(2, 2)
print 2 2
2%2 = 1 … 0, 2%2 = 1 … 0
2*func1(a/2, b/2) = 2*func1(2/2, 2/2) = 2*func1(1, 1)
print 1 1
1%2 = 0 … 1, 1%2 = 0 … 1
func1((1+1)/2, (1-1)/2) = func1(1, 0)
print 1 0
return 1
2*2*2 = 8
print 8
(二)
#include <stdio.h> #include <stdbool.h> int func2(int A[ ], int x, int y) { if (x > y) return false; else { int m = (x+y)/2; printf("%3d %3d %3d\n", x, m, y); if (A[m] == m) return true; else if (A[m] > m) return func2(A, x, m-1); else return func2(A, m+1, y); } } int main(void) { int a[ ] = {35, 60, 45, 7, 10, 22, 2, 50, 14, 3, 66}; printf("%3d", func2(a, 1, 10)); } |
執行結果:
1 5 10
1 2 4
1 1 1
0
說明:
func2(int A[ ], int x, int y) = func2(a, 1, 10)
x < y → 1 < 10
m = (x+y)/2 = (1+10)/2 = 5
printf("%3d %3d %3d", x, m, y)
print 1 5 10
A[m] = A[5] = 22
A[m] > m → 22 > 5
func2(A, x, m-1) = func2(A, 1, 4)
func2(int A[ ], int x, int y) = func2(a, 1, 4)
x < y → 1 < 4
m = (1+4)/2 = (1+4)/2 = 2
printf("%3d %3d %3d", x, m, y)
print 1 2 4
A[m] = A[2] = 45
A[m] > m → 45 > 2
func2(A, x, m-1) = func2(A, 1, 1)
func2(int A[ ], int x, int y) = func2(a, 1, 1)
x == y → 1 == 1
m = (x+y)/2 = (1+1)/2 = 1
printf("%3d %3d %3d", x, m, y)
print 1 1 1
A[m] = A[1] = 35
A[m] > m → 35 > 1
func2(A, x, m-1) = func2(A, 1, 0)
func2(int A[ ], int x, int y) = func2(a, 1, 0)
x > y → 1 > 0
return false