Kunci Jawaban OSK 2013
Pembahasan Soal OSK 2013
Pembahasan Programming OSK 2013
31. Perhatikan fungsi dari potongan program berikut!
function panggil1(x:longint):longint; begin if (x<3) then panggil1:=0 else panggil1:=panggil1(x-1)+2*panggil1(x-2)+3; end;
Bila fungsi di atas dipanggil dengan panggil1(7), maka hasil keluarannya adalah:
Solusi : Fungsi panggil1 disingkat fungsi p.
p(7) = p(6) + 2*p(5) + 3 = 30 + 2*15 + 3 = 63
p(6) = p(5) + 2*p(4) + 3 = 15 + 2*6 + 3 = 30
p(5) = p(4) + 2*p(3) + 3 = 6 + 2*3 + 3 = 15
p(4) = p(3) + 2*p(2) + 3 = 3 + 2*0 + 3 = 6
p(3) = p(2) + 2*p(1) + 3 = 0 + 2*0 + 3 = 3
p(2) = 0
p(1) = 0
p(6) = p(5) + 2*p(4) + 3 = 15 + 2*6 + 3 = 30
p(5) = p(4) + 2*p(3) + 3 = 6 + 2*3 + 3 = 15
p(4) = p(3) + 2*p(2) + 3 = 3 + 2*0 + 3 = 6
p(3) = p(2) + 2*p(1) + 3 = 0 + 2*0 + 3 = 3
p(2) = 0
p(1) = 0
Maka panggil1(7) = 63.
32. Perhatikan fungsi dari potongan program berikut!
function sikat(x,y:longint):longint; begin if (x>=y) then sikat:=x else sikat:=3*sikat(x+1,y)+2*sikat(x,y-1); end;
Bila fungsi di atas dipanggil dengan sikat(1,3), maka hasi keluarannya adalah:
Solusi : Fungsi sikat disingkat fungsi s
s(1,3) = 3 * s(2,3) + 2 * s(1,2) = 3 * 13 + 2 * 8 = 55
s(2,3) = 3 * s(3,3) + 2 * s(2,2) = 3 * 3 + 2 * 2 = 13
s(3,3) = 3
s(2,2) = 2
s(1,2) = 3 * s(2,2) + 2 * s(1,1) = 3 * 2 + 2 * 1 = 8
s(1,1) = 1
s(2,3) = 3 * s(3,3) + 2 * s(2,2) = 3 * 3 + 2 * 2 = 13
s(3,3) = 3
s(2,2) = 2
s(1,2) = 3 * s(2,2) + 2 * s(1,1) = 3 * 2 + 2 * 1 = 8
s(1,1) = 1
Maka sikat(1,3) = 55.
33. Perhatikan potongan program di bawah ini!
function hitung(n:integer):integer; begin if(n=0)then hitung:=0 else hitung:=hitung(n div 5) + (n mod 5); end;
Berapa nilai dari hitung(2903)?
Solusi : Fungsi hitung disingkat fungsi h
h(2903) = h(580) + 3 = 8 + 3 = 11
h(580) = h(116) + 0 = 8 + 0 = 8
h(116) = h(23) + 1 = 7 + 1 = 8
h(23) = h(4) + 3 = 4 + 3 = 7
h(4) = h(0) + 4 = 0 + 4 = 4
h(0) = 0
h(580) = h(116) + 0 = 8 + 0 = 8
h(116) = h(23) + 1 = 7 + 1 = 8
h(23) = h(4) + 3 = 4 + 3 = 7
h(4) = h(0) + 4 = 0 + 4 = 4
h(0) = 0
Maka hitung(2903) = 11
34. Perhatikan fungsi di bawah ini!
function wow(n:integer):integer; var res, i, cnt : integer; begin res:=1; for i:=2 to n do if(n mod i = 0) then begin cnt:= 0; while (n mod i = 0) do begin n:=n div i; cnt:= cnt+1; end; res:=res*(cnt+1); end; wow:=res; end;
Solusi : Jika diperhatikan dengan saksama, program ini merupakan program mencari banyaknya faktor sebuah bilangan. Maka kita bisa melihat langsung dari pilihan
A. 32 = 2^5, mempunyai 6 faktor
B. 512 = 2^9, mempunyai 10 faktor
C. 1000 = 2^3 * 5^3, mempunyai 4 * 4 faktor = 16 faktor
D. 48 = 2^4 * 3, mempunyai 5 * 2 faktor = 10 faktor
E. 38 = 2 * 19, mempunyai 2 * 2 faktor = 4 faktor
B. 512 = 2^9, mempunyai 10 faktor
C. 1000 = 2^3 * 5^3, mempunyai 4 * 4 faktor = 16 faktor
D. 48 = 2^4 * 3, mempunyai 5 * 2 faktor = 10 faktor
E. 38 = 2 * 19, mempunyai 2 * 2 faktor = 4 faktor
Maka, n minimum agar wow(n) bernilai 10 adalah D. 48
35.
var head, tail, x : integer; stek: array [1..100] of integer; function pop():integer; begin if (head = tail) then pop := -1 else begin pop := stek[head]; head := head + 1; end; end; begin stek[3] := 5; stek[2] := 3; stek[4] := 7; stek[1] := 1; stek[5] := 9; head := 1; tail := 6; pop(); for x := 1 to 3 do writeln( pop() ); pop(); end.
Jika program tersebut dijalankan, maka pada layar akan tampil:
Solusi : Bisa dilihat bahwa array[1..5] isinya adalah [1,3,5,7,9]. Pada fungsi pemanggilan pertama pop dijalankan, maka nilai head telah menjadi 2, sehingga pada variabel for angka yang dicetak adalah angka pada array ke 2 sampai array ke 4 yaitu : 3,5,7.
36. Diberikan potongan program berikut:
pop(); for x := 1 to 3 do writeln( pop() ); pop();
jika potongan program tersebut diganti dengan
for x := 1 to 3 do if (pop() <> -1) then writeln( pop() );
berapakah outputnya sekarang?
Solusi : Dapat dilihat di sini bahwa pada setiap perulangan, fungsi pop dijalankan dua kali, jadi yang akan dicetak adalah array ke 2, array ke 4, dan array ke 6. Yaitu : 3,7,-1. Array ke 6 berisi 1 karena head = tail.
Program berikut ditujukan untuk soal no. 37 dan 38
function Bunga(x: longint):longint; var i, Bungai : longint; begin if (x = 0) then Bunga := 1 else begin Bungai := 0; for i := 0 to x-1 do Bungai := Bungai + Bunga(i); Bunga := Bungai; end; end;
37. Berapakah hasil dari Bunga(3)?
Solusi :
Dari sini bisa dilihat bahwa : Bunga(0) = 1, Bunga(1) = 1, Bunga(2) = Bunga(1) + Bunga(0) = 2. Maka sudah jelas bahwa Bunga(3) = Bunga(2) + Bunga(1) + Bunga(0) = 2 + 1 + 1 = 4.
Dari sini bisa dilihat bahwa : Bunga(0) = 1, Bunga(1) = 1, Bunga(2) = Bunga(1) + Bunga(0) = 2. Maka sudah jelas bahwa Bunga(3) = Bunga(2) + Bunga(1) + Bunga(0) = 2 + 1 + 1 = 4.
38. Berapakah hasil dari Bunga(21)?
Solusi :
Jika diteruskan dari pola di atas maka didapat Bunga(4) = 4+2+1+1 = 8. Kita bisa melihat bahwa hasil dari Bunga(n) = 2 ^ (n-1). Maka hasil dari Bunga(21) = 2 ^ 20 = 1048576.
Jika diteruskan dari pola di atas maka didapat Bunga(4) = 4+2+1+1 = 8. Kita bisa melihat bahwa hasil dari Bunga(n) = 2 ^ (n-1). Maka hasil dari Bunga(21) = 2 ^ 20 = 1048576.
Program berikut untuk no. 39 s.d. 41
var x,y,temp,dare,num1,num2 : integer; begin readln(x,y); num1:=x; num2:=y; dare:=0; temp:=1; while(num1 or num2 >0) do begin if(num1 mod 2 + num2 mod 2 = 1) then dare := dare + temp else dare := dare + ( (num1 mod 2 + num2 mod 2) * temp ); num1 := num1 div 2; num2 := num2 div 2; temp := temp * 2; end; writeln(dare); end.
39. Apabila program di atas diberi masukan 16 8, berapakah output yang dihasilkan oleh
program di atas?
program di atas?
Solusi : Kita buat tabel untuk membantu pencarian kita
num1 | num2 | temp | dare |
16 | 8 | 1 | 0 |
8 | 4 | 2 | 0 |
4 | 2 | 4 | 0 |
2 | 1 | 8 | 0 |
1 | 0 | 16 | 0+8 |
0 | 0 | 32 | 8+16 |
Didapat hasil akhir dare = 24.
Dari sini juga didapat bahwa program ini bertujuan untuk menjumlahkan dua buah bilangan.
Dari sini juga didapat bahwa program ini bertujuan untuk menjumlahkan dua buah bilangan.
40. Apabila nilai x = 120 dan nilai y = 30 berapakah output yang dihasilkan oleh program di atas?
Solusi : Program ini menjumlahkan x dan y. 150 + 30 = 180
41. Apabila kita perhatikan potongan program di atas adalah potongan program?
Solusi : Menjumlahkan 2 buah bilangan bulat positif
42. Diberikan potongan program berikut ini!
const M=100; var x,i,n,h:longint; A:array[1..M] of boolean; B:array[1..M] of longint; begin for i:=1 to M do A[i]:=true; n:=0; for i:=2 to M do begin if A[i] then begin n:=n+1; B[n]:=i; h:=i; while h<M do begin h:=h+i; if h<=M then A[h]:=false; end; end; end; readln(x); writeln(B[x]); end.
Berapakah hasil program di atas apabila x = 10?
Solusi : Program ini, bertujuan untuk mencari bilangan prima ke x, menggunakan cara Sieve Of Eratosthenes. Maka yang dicetak adalah bilangan prima ke 10, yaitu 29.
43. Diberikan potongan program berikut ini:
var A: array[1..5] of longint = (1, 2, 3, 4, 5); i, j, t: longint; begin for i := 1 to 5 do for j := 1 to i do begin t := A[i] xor A[j]; A[i] := t xor A[i]; A[j] := t xor A[i] end; for i := 1 to 5 do begin if (i <> 1) then write(' '); write(A[i]) end; writeln; end.
Apa hasil dari program tersebut?
Solusi : Inti dari program ini adalah swap, jadi program ini bertujuan untuk menukar dua buah bilangan. Maka hasil yang akan dicetak adalah hasil yang terbalik dari semula yaitu 5 4 3 2 1.
Program berikut ditujukan untuk soal no. 44 dan 45
var data : array[1..10] of integer = (3,9,2,6,1,4,7,8,5,10); procedure kambing(m : integer); begin if (m<=10) then begin kambing(m*2); write(data[m],’ ’); kambing(m*2+1); end; end;
44. Output yang dihasilkan jika dilakukan pemanggilan kambing(1) adalah ….
Solusi :
Program kambing(1) memanggil kambing(2).
Kambing(2) memanggil Kambing(4)
Kambing(4) memanggil Kambing(8)
Kambing(8) memanggil Kambing(16)
Kambing(16) tidak diproses.
Cetak array ke-8 Yaitu 8.
Kambing(8) memanggil kambing(17)
Kambing(17) tidak diproses.
Kembali ke kambing(4)
Cetak array ke-4 yaitu 6.
Program kambing(1) memanggil kambing(2).
Kambing(2) memanggil Kambing(4)
Kambing(4) memanggil Kambing(8)
Kambing(8) memanggil Kambing(16)
Kambing(16) tidak diproses.
Cetak array ke-8 Yaitu 8.
Kambing(8) memanggil kambing(17)
Kambing(17) tidak diproses.
Kembali ke kambing(4)
Cetak array ke-4 yaitu 6.
Dari sini saja sudah terlihat bahwa satu-satunya jawaban yang sesuai dengan pilihan adalah option D. D. 8 6 5 9 10 1 3 4 2 7. Maka jawabannya adalah D.
45. Agar output yang dihasilkan terurut menaik setelah pemanggilan kambing(1), maka array
data harus berisi ….
data harus berisi ….
Solusi : Kita perlu mengecek urutan dari array tersebut. Agar terurut, array ke delapan haruslah angka 1. Dan hanya ada satu pilihan jawaban yaitu A. Jadi jawabannya adalah A. (7,4,9,2,6,8,10,1,3,5).
46. Diberikan potongan program berikut ini:
i := 0; while (x>1) do begin if (x mod 2 = 1) then x := 3*x+1 else x := x div 2; inc(i); end; writeln(i);
Jika x = 13, maka output dari program di atas adalah ….
Solusi : Untuk mempermudah buat tabel
Nilai x | Nilai i |
13 | 0 |
40 | 1 |
20 | 2 |
10 | 3 |
5 | 4 |
16 | 5 |
8 | 6 |
4 | 7 |
2 | 8 |
1 | 9 |
Potongan kode program berikut ini digunakan untuk soal no 47-49
function abc(a:integer) : integer; begin abc :=a*3-(a mod 7); {a} end; function ghi(x:integer;b:integer):integer; begin if (b=1) then ghi := x else ghi := (x* ghi(x,b-1)) mod 100; end; function def(a:integer; b:integer) : integer; begin if (b mod 2 = 1) and (b>500) then def := ghi(a,b) mod 100 {b} else def:=def(a, abc(b)) ; end;
47. Berapakah hasil dari pemanggilan fungsi def(7,100) ?
Solusi : Di sini, kita bisa lihat fungsi ghi merupakan sebuah fungsi perpangkatan ( x ^ b ).
Def(7,100) = def(7,298) = def(7,890) = def(7,2669).
def(7,2669) = ghi(7,2669)
Maka hasil def(7,100) = ghi(7,2669) = 7 ^ 2669 mod 100 = 7.
Def(7,100) = def(7,298) = def(7,890) = def(7,2669).
def(7,2669) = ghi(7,2669)
Maka hasil def(7,100) = ghi(7,2669) = 7 ^ 2669 mod 100 = 7.
Kita bisa melihat bahwa pada perpangkatan 7 terdapat pola unik
7^0 = 1
7^1 = 7
7^2 = 49
7^3 = 343
7^4 = 2401
7^5 = 16807 (berulang)
7^0 = 1
7^1 = 7
7^2 = 49
7^3 = 343
7^4 = 2401
7^5 = 16807 (berulang)
Perulangan terjadi setelah 4 kali. Maka 2669 mod 4 = 1. Maka 7 ^ 2669 mod 100 = 7 ^ 1 mod 100 = 7.
48. Apabila bagian (a) diubah menjadi abc := a*2 (a mod 5), maka berapakah hasil pemanggilan fungsi def(7,151)?
Solusi : def(7,151) = def(7,301) = def(7,601) = ghi(7,601) = 7^601 mod 100 = 7.
49. Apabila bagian (b) diubah menjadi def := ghi(a,b) mod 10, maka berapakah hasil pemanggilan
fungsi def(3,30)?
fungsi def(3,30)?
Solusi : def(3,30) = def(3,88) = def(3,260) = def(3,779) = ghi(3,779) = 7
Sebenarnya nomor 47-49 lucu, jawabannya 7 semua :v wkwkwk
50. Diberikan potongan kode program berikut ini
function tebak_angka(x,y: integer): integer; begin if x y then begin tebak_angka := tebak_angka(y,x); end else begin tebak_angka := tebak_angka(x, y-(x mod 5)-1); end; end;
Apakah outputnya jika perintah writeln(tebak_angka(18,30)) dipanggil?
Solusi : Fungsi tebakangka disingkat fungsi t
t(18,30) = t(18,26) = t(18,22) = t(18,18) = t(18,14) = t(14,18) = t(14,13) = t(13,14) = t(13,10) = t(10,13) = t(10,12) = t(10,11) = t(10,10) = t(10,9) = t(9,10) = t(9,5) = t(5,9) = t(5,8) = t(5,7) = t(5,6) = t(5,5) = t(5,4) = t(4,5) maka tebakangka = 5.
t(18,30) = t(18,26) = t(18,22) = t(18,18) = t(18,14) = t(14,18) = t(14,13) = t(13,14) = t(13,10) = t(10,13) = t(10,12) = t(10,11) = t(10,10) = t(10,9) = t(9,10) = t(9,5) = t(5,9) = t(5,8) = t(5,7) = t(5,6) = t(5,5) = t(5,4) = t(4,5) maka tebakangka = 5.
Maka tebakangka(18,30) hasilnya adalah 5.