程序园

自定义任意进制

2020-04-24  本文已影响0人  triplestudio

因为数字太长,想用更短的形式来表示,十六进制还不够,于是来个自定义转换。

分析归纳

对于 n 进制,表示满 n 进 1 位,如 9 + 1,在 10 进制里,满 10 了,就应该是进 1 位使用 10 表示了,而在 16 进制里,因为未满 16,仍在字符集的表示范围内,所以直接使用 A 表示。

由此:给定一个长度的字符集,即可进行类似的表示

算法实现

基本思路:从个位向高位逐个得到该位的字符即可。
以下为 javascript 实现:

// num : 一个整数
// charSet : 一个字符集
function base(num, charSet){
    // 个位以内,直接返回
    if(num < charSet.length){
        return charSet.substr(num, 1);
    }
    // 递归个位以上的部分
    var high = Math.floor(num / charSet.length);
    var unit = num % charSet.length;
    return base(high, charSet) + charSet.substr(unit, 1);
}

// 以下调用输出 0 - 32 的16进制形式:
for(var i=0; i<=32; i++){
    document.write(base(i, '0123456789ABCDEF') + ' ');
}
输出:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20

以下为 php 的实现:

function base($num, $charSet){
    // 个位以内,直接返回
    if($num < strlen($charSet)){
        return substr($charSet, $num, 1);
    }
    // 递归个位以上的部分
    $high = floor($num / strlen($charSet));
    $unit = $num % strlen($charSet);
    return base($high, $charSet) . substr($charSet, $unit, 1);
}

echo base(?,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');

以上代码得到了 S6AG,你知道是什么数字吗?

上一篇下一篇

猜你喜欢

热点阅读