我想将基数10转换为基数31
我只想使用这些字符:23456789abcdefghjkmnpqrstuvwxyz
如您所见,排除了5个字符(我不需要这些字符):1 0 o l i
我现在拥有的功能如下,但当然不起作用。输入2时输出4. tenTo31(2)
的输出应为2
function tenTo31($num)
{
$out = "";
$alpha = "23456789abcdefghjkmnpqrstuvwxyz";
while($num > 30)
{
$r = $num % 31;
$num = floor($num / 31) - 1;
$out = $alpha[$r] . $out;
}
return $alpha[$num] . $out;
}
关于如何使这项工作的任何想法?
答案 0 :(得分:4)
这是对你想要的盲目猜测:
$alpha = "yz23456789abcdefghjkmnpqrstuvwx";
答案 1 :(得分:3)
有一个内置函数可以从一个基础转换为另一个基础base_convert()。字母表已修复,但您可以使用strtr()将这些数字替换为您自己的数字。
“tenTo31(2)的输出应为2”:一种可能性是再次将'2'作为第三个符号。
function tenTo31($num) {
static $from = "0123456789abcdefghijklmnopqrstu";
static $to = "yz23456789abcdefghjkmnpqrstuvwx";
return strtr(base_convert($num, 10, 31), $from, $to);
}
for($i=0; $i<31; $i++) {
echo $i, '=', tenTo31($i), ' | ';
if ( 9===$i%10 ) echo "\n";
}
打印
0=y | 1=z | 2=2 | 3=3 | 4=4 | 5=5 | 6=6 | 7=7 | 8=8 | 9=9 |
10=a | 11=b | 12=c | 13=d | 14=e | 15=f | 16=g | 17=h | 18=j | 19=k |
20=m | 21=n | 22=p | 23=q | 24=r | 25=s | 26=t | 27=u | 28=v | 29=w |
30=x |
编辑: 要将base(31)数转换回十进制,首先必须反转转换(strtr),然后调用base_convert(..,31,10)。您可以在单个函数中将转换与from(31)结合使用。
function convert_ten_31($num, $numIsDecimal) {
static $default = "0123456789abcdefghijklmnopqrstu";
static $symbols = "yz23456789abcdefghjkmnpqrstuvwx";
if ( $numIsDecimal ) {
return strtr(base_convert($num, 10, 31), $default, $symbols);
}
else {
return base_convert(strtr($num, $symbols, $default), 31, 10);
}
}
// testing
for($i=0; $i<10000; $i++) {
$x = convert_ten_31($i, true);
$x = convert_ten_31($x, false);
if ( $i!==(int)$x ) {
var_dump($i, $x);
die;
}
}
echo 'done.';
也可以自己编写像base_convert()这样的函数,将符号作为参数,从而具有一个灵活的函数,而不是tenTo30(),tenTo31(),tenTo32(),....
答案 2 :(得分:2)
你没有使用1和0字符,你的编号系统中的第一个数字是2意味着2相当于基数10中的0。3相当于基数10中的1和4相当于2中的数字10。
答案 3 :(得分:1)
你为什么要把模块拿到32?你应该使用%31和/ 31。在基数10中,我们使用模块10,所以应该在基数31中。但是如果我们忘记了这一点,我认为你的逻辑是正确的。我无法理解为什么基数10中的2等于基数31中的4使用“修改过的数字”。
答案 4 :(得分:0)
虽然我鼓励您继续使用算法进行学习练习,但如果您只是需要完成工作,请考虑使用base_convert。
答案 5 :(得分:0)
根据http://www.crockford.com/wrmg/base32.html的映射似乎是:
function symbolToEncode ($num) {
$out = "";
static $alpha = "0123456789ABCDEFGHJKMNPQRSTVWXYZ*~$=U";
while ($num >= 37) {
$r = $num % 37;
$num = floor ($num / 37);
$out = $out . $alpha[$r];
}
return $out . $alpha[$num];
}
function decodeToEncode ($str) {
static $from = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*~=$";
static $to = "0123456789ABCDEFGH1JK1MN0PQRSTUVWXYZABCDEFGH1JK1MN0PQRSTUVWXYZ*~=$";
return strtr ($str, $from, $to);
}
虽然显然真正的挑战是编写encodeToSymbol()函数。我不是一个真正的PHP专家(我的字符串可能需要以某种方式转义 - 提示?),所以我会把它留给其他人。