Skip to content

Instantly share code, notes, and snippets.

@Sankame
Last active December 31, 2015 14:31
Show Gist options
  • Save Sankame/87f7b5050a802e5e5710 to your computer and use it in GitHub Desktop.
Save Sankame/87f7b5050a802e5e5710 to your computer and use it in GitHub Desktop.
10進数をn進数に変換
<?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