Posts Tagged ‘ algoritma ’

Algoritma Pemrograman – Membagi Nominal Ke Pecahan Menggunakan PHP

Kali ini saya iseng-iseng menulis blog tentang algoritma. Saya juga iseng-iseng mengerjakan salah satu soal pada algoritma pemrograman menggunakan PHP, yaitu bagaimana cara memecah nominal sejumlah uang menjadi pecahan uang (secara fisik). Misal ada uang  Rp 2500, maka uang tersebut terbagi menjadi uang apa saja? Secara gampang kita akan menjawab 1 lembar 2 ribuan dan 1 koin 5 ratus.  Tapi bagaimana menerjemahkan ke dalam bahasa pemrograman? Saya akan mencoba memecahkannya menggunakan PHP.

Kode PHP-nya kurang lebih sebagai berikut:

<?php
$duit = array(100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1);
$nom = 98875;
echo "<h4>Nominal : " . $nom . "</h4>";
for ($i = 0; $i < count($duit); $i++) {
 if ($nom % $duit[$i] < $nom) {
 echo floor($nom / $duit[$i]) . " -> " . $duit[$i] . "<br/>";
 $nom = $nom % $duit[$i];
 }
}
?>

Oke, kita bahas kode diatas.

$duit = array(100000, 50000, 20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 25, 10, 5, 1);
$nom = 98875;
echo "<h4>Nominal : " . $nom . "</h4>";
  1. $duit berisi array dari semua uang yang ada di negara kita, disini saya buat sampai 1 Rupiah.
  2. $nom adalah nominal uang yang akan kita pecah.
  3. echo … Menampilkan Nominal uang yang akan dipecah.
for ($i = 0; $i < count($duit); $i++) {
 if ($nom % $duit[$i] < $nom) {
 echo floor($nom / $duit[$i]) . " -> " . $duit[$i] . "<br/>";
 $nom = $nom % $duit[$i];
 }
}

Disini menggunakan looping (for) pada array $duit untuk melakukan cek terhadap nominal, jadi lopping akan meng-eksekusi sebanyak jumlah pecahan uang (15 kali). Kemudian dicocokkan dengan nominal, jika sisa pembagian (modulo/modulus) dengan uang di array pertama lebih kecil, maka akan dilanjutkan ke array berikutnya dan seterusnya sampai pencocokan selesai. Pencocokan ini dimulai dari uang yang paling besar. Sehingga cara kerjanya seperti ini:

Misal Nominalnya adalah 98875.

  • Cek apakah modulus (98875/100000) < 98875? Tidak, maka akan dilanjutkan ke Uang berikutnya tanpa mencetak tulisan.
  • Cek apakah modulus (98875/50000) < 98875? Ya, hasil bagi=1 dan sisa=48875, cetak 1 x 50000. Simpan sisa ke $nom.
  • Cek apakah modulus (48875/20000) < 48875? Ya, hasil bagi=2 dan sisa=8875, cetak 2 x 20000. Simpan sisa ke $nom.
  • Cek apakah modulus (8875/10000) < 8875? Tidak, Lanjut ke Uang berikutnya. $nom masih tetap.
  • Cek apakah modulus (8875/5000) < 8875? Ya, hasil bagi=1 dan sisa=3875. Cetak 1 x 5000. Simpan sisa ke $nom.
  • Cek apakah modulus (3875/2000) < 3875? Ya, hasil bagi=1 dan sisa=1875. Cetak 1 x 2000. Simpan sisa ke $nom.
  • Cek apakah modulus (1875/1000) < 1875? Ya, hasil bagi=1 dan sisa=875. Cetak 1 x 1000. Simpan sisa ke $nom.
  • Cek apakah modulus (875/500) < 875? Ya, hasil bagi=1 dan sisa=375. Cetak 1 x 500. Simpan sisa ke $nom.
  • Cek apakah modulus (375/200) < 375? Ya, hasil bagi=1 dan sisa=175. Cetak 1 x 200. Simpan sisa ke $nom.
  • Cek apakah modulus (175/100) < 175? Ya, hasil bagi=1 dan sisa=75. Cetak 1 x 100. Simpan sisa ke $nom.
  • Cek apakah modulus (75/50) < 75? Ya, hasil bagi=1 dan sisa=25. Cetak 1 x 50. Simpan sisa ke $nom.
  • Cek apakah modulus (25/25) < 25? Ya, hasil bagi=1 dan sisa=0. Cetak 1 x 25. Simpan sisa ke $nom.
  • Karena nilai $nom adalah 0, maka Uang berikutnya pasti tidak akan muncul.

Penasaran dengan hasilnya? Silahkan dicoba sendiri. Semoga bermanfaat.