类似于基数转换的数字表示


Number representation similar to base conversion

我想弄清楚如何使基数转换(基数36)使用0作为第一个字符。

我想用一种方案来表示正整数,其中1表示为0, 10表示为9, 11表示为a,以此类推,其中前导零是有效的。

所以convert(36)应该是z然后convert(37)应该是00

我认为这种格式与基数36足够相似,我应该能够使用base_convert来做到这一点,但我还没能弄清楚如何

下面是按您想要的方式进行转换的函数。也许可以更有效地完成它,但至少这个完成了:

function base_convert_0($number, $from_base, $to_base){
    $numeric = base_convert($number, $from_base, 10);
    $result = ''; 
    while($numeric > $to_base){
        $result = base_convert(($numeric - 1) % $to_base, 10, 36) . $result;
        $numeric = floor(($numeric - 1)/$to_base);
    }   
    $result = base_convert(($numeric - 1), 10, 36) . $result;
    return $result;
}

5000行输出

80行显示在这里(base_convert_0($i, 10, 36)):

1: 0
2: 1
3: 2
4: 3
5: 4
6: 5
7: 6
8: 7
9: 8
10: 9
11: a
12: b
13: c
14: d
15: e
16: f
17: g
18: h
19: i
20: j
21: k
22: l
23: m
24: n
25: o
26: p
27: q
28: r
29: s
30: t
31: u
32: v
33: w
34: x
35: y
36: z
37: 00
38: 01
39: 02
40: 03
41: 04
42: 05
43: 06
44: 07
45: 08
46: 09
47: 0a
48: 0b
49: 0c
50: 0d
51: 0e
52: 0f
53: 0g
54: 0h
55: 0i
56: 0j
57: 0k
58: 0l
59: 0m
60: 0n
61: 0o
62: 0p
63: 0q
64: 0r
65: 0s
66: 0t
67: 0u
68: 0v
69: 0w
70: 0x
71: 0y
72: 0z
73: 10
74: 11
75: 12
76: 13
77: 14
78: 15
79: 16
80: 17

我不确定你是否需要反转这个,但这是最简单的部分:

function base_convert_un0($number, $from_base, $to_base){
    $as_string = strval($number);
    for($result = $j = 0, $i = strlen($as_string); $i--; $j++)
        $result += (base_convert($as_string{$i}, $from_base, 10) + 1)*pow($from_base, $j);
    return base_convert($result, 10, $to_base);
}

我真的不明白你的转换的意义,但你不只是尝试转换n-1吗?

base_convert ($number_to_convert - 1, 10, 36);

EDIT:如果1基数10转换为0您的特殊基数 -您将使用哪个字符表示0?我认为你的系统不能用于有效的数字符号。

EDIT2:我可能对这个问题的理解过于数学化了。请参考@Paulpro的答案,一个务实的解决方案的问题(这实际上不是转换到另一个基数,但返回一个字符串表示输入数字)。