-4

我试图弄清楚如何使基本转换(base 36)使用 0 作为第一个字符。

我想使用一种方案来表示正整数,其中1表示为010表示为911表示为a,等等,其中前导零很重要。

所以convert(36)应该给我z,然后convert(37)应该给我00

我认为这种格式与 base 36 足够相似,我应该能够使用base_convert来做到这一点,但我无法弄清楚如何。

4

2 回答 2

1

这是一个以您想要的方式进行转换的函数。它可能会更有效地完成,但至少可以完成它:

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);
}
于 2013-06-03T20:15:50.800 回答
-1

我不太了解您转换的意义,但是您不只是尝试转换n-1吗?

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

编辑:如果 1 base 10转换为 0你的特殊基础- 你将使用什么字符作为 0?我认为您的系统不能用于有效的数字符号。

EDIT2:我可能以过于数学的方式理解了这个问题。请参阅@Paulpro 的答案以获取该问题的实用解决方案(实际上并不是转换为另一个基数,而是返回一个表示输入数字的字符串)。

于 2013-06-03T18:18:15.523 回答