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.
Tidak ada komentar:
Posting Komentar