Last active
December 31, 2015 14:31
-
-
Save Sankame/87f7b5050a802e5e5710 to your computer and use it in GitHub Desktop.
10進数をn進数に変換
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// 2進数へ。 | |
echo myAssertEquals('10100', changeDecimalToBaseN(20, 2)) . "\n"; | |
// 8進数へ。 | |
echo myAssertEquals('24', changeDecimalToBaseN(20, 8)) . "\n"; | |
// 16進数へ。 | |
echo myAssertEquals('14', changeDecimalToBaseN(20, 16)) . "\n"; | |
// 16進数へ。回答にアルファベットが入る場合。 | |
echo myAssertEquals('1B', changeDecimalToBaseN(27, 16)) . "\n"; | |
// 15進数へ。 | |
echo myAssertEquals('15', changeDecimalToBaseN(20, 15)) . "\n"; | |
// 変換元の値より基数が大きい場合。 | |
echo myAssertEquals('02', changeDecimalToBaseN(2, 16)) . "\n"; | |
// 対象外の基数。 | |
echo myAssertEquals('', changeDecimalToBaseN(20, 17)) . "\n"; | |
// 正の整数ではない場合。 | |
echo myAssertEquals('', changeDecimalToBaseN(0, 0)) . "\n"; | |
//-------------------------------------- | |
// 10進数をn進数に変換 | |
// | |
// @param $decimal 10進数の値 (正の整数) | |
// @param $baseNumber 基数n (1~16) | |
// @return n進数に変換後の値 | |
//-------------------------------------- | |
function changeDecimalToBaseN($decimal, $baseNumber){ | |
if($decimal <= 0){ | |
return ''; | |
} | |
if($baseNumber < 1 || $baseNumber > 16){ | |
return ''; | |
} | |
$target = $decimal; | |
// 余り格納用。 | |
$remainder = array(); | |
while(true){ | |
$remainder[] = changeNumberToAlphabet($target % $baseNumber); | |
$answer = floor($target / $baseNumber); | |
$target = $answer; | |
if($answer < $baseNumber){ | |
break; | |
} | |
} | |
$lengthOfRemainder = count($remainder); | |
// 余りを逆順に連結。 | |
for($i=0; $i<$lengthOfRemainder; $i++){ | |
$remainderString = $remainderString . $remainder[$lengthOfRemainder-$i-1]; | |
} | |
return $target . $remainderString; | |
} | |
// 数字をアルファベットに変換 | |
function changeNumberToAlphabet($number){ | |
if($number < 10){ | |
return $number; | |
} | |
$converter = array( | |
'10'=>'A', '11'=>'B', '12'=>'C' | |
,'13'=>'D', '14'=>'E', '15'=>'F' | |
); | |
return $converter[$number]; | |
} | |
// 確認用 | |
function myAssertEquals($expected, $actual){ | |
if($expected == $actual){ | |
return 'OK'; | |
}else{ | |
return 'NG'; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment