Pemfaktoran bilangan pecahan STRING

Di milis ada yang tanya,
Ada kasus rada aneh nih, pelajaran jaman SD sebenernya. Misalnya ada string 5/20 maka setelah diproses hasilnya adalah 1/4, dari 2/10 menjadi 1/5. Ada yang tau rumusnya? Thx. akhirnya semua pada coba-coba bikin fungsi untuk kasus ini.
Code 1: by Me <?php /* Pemfaktoran bilangan Cacah Jilid 1 by Stieven R. Kalengkian Untuk SD Kelas 6 cawu 2 (LOL) */ function test($x) { //Pisahkan String PEMBILANG dan PEMBAGI $d=explode('/',$x); //Kumpul nilai faktor pembagi dari PEMBILANG for ($i=1;$i<=$d[0];$i++) { if ($d[0]%$i == 0) { $akar[0][]=$i; } } //Kumpul nilai faktor pembagi dari PEMBAGI for ($i=1;$i<=$d[1];$i++) { if ($d[1]%$i == 0) { $akar[1][]=$i; } } //Tentukan paling banyak bilangan faktor //PEMBAGI atau PEMBILANG if (count($akar[1]) > count($akar[0])) { $a=1; $b=0; } else { $a=0; $b=1; } //Mencari Bilangan Faktor terbesar for($i=count($akar[$a]);$i>=0;$i--) { if (in_array($akar[$a][$i],$akar[$b])) { $k=$akar[$a][$i]; break; } } //Membagi PEMBILANG dan PEMBAGI dengan //Bilangan faktor terbesar $d[0]=$d[0]/$k; $d[1]=$d[1]/$k; //Satukan kembali menjadi string return join('/',$d); } echo test('12/36'); echo "\n"; ?> Code 2: by Arie W. Subagja <?php $x = '4/6'; function xx($str) { $s = explode('/', $str); if ($s[0] == 0 OR $s[1] == 0) { return $str; } if ($s[0] == $s[1]) { return '1/1'; } $pembagi = $s[0] > $s[1] ? $s[1] : $s[0]; $_p = 1; // ambil pembagi paling besar, // ada cara laen selain looping?? for ($i = 1; $i <= $pembagi; $i++) { if ((0 == ($s[0] % $i)) AND (0 == ($s[1] % $i))) { $_p = $i; } } return ( $s[0] / $_p ) . '/' . ( $s[1] / $_p ); } echo xx($x); ?> Code 3: by Youppie Arliansyah
Sekedar nambahin variasi dari yang udah dibuat sama Pak Stieven. Terus terang kasus ini jadi kepikiran bahkan ditengah jalan habis jemput istri pulang kantor. Nah, kuncinya sebenarnya adalah FPB (Faktor Persekutuan Terbesar) dari pembilang dan penyebut. Nantinya masing-masing pembilang dan penyebut dibagi dengan FPB tadi maka kita bisa dapatkan bentuk pecahan terkecilnya. Kode berikut hasil googling untuk mencari algoritma euclidean yang katannya paling efisien untuk mendapatkan FPB
<?php $rumus1='5/20'; function pecahan_terkecil($x){ $s=explode("/",$x); $faktorpersekutuanterbesar=fpb($s[1],$s[0]); $pembilang=$s[0]/$faktorpersekutuanterbesar; $penyebut=$s[1]/$faktorpersekutuanterbesar; return $pembilang."/".$penyebut; } function fpb($a, $b){ while ($b != 0){ $t = $b; $b = $a %$b; $a = $t; } return $a; } echo pecahan_terkecil($rumus1); ?> Nah semoga bermanfaat.

Komentar