【问题标题】:Number representation similar to base conversion类似于基本转换的数字表示
【发布时间】:2013-06-03 18:09:44
【问题描述】:

我正在尝试弄清楚如何使基础转换(以 36 为基础)使用 0 作为第一个字符。

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

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

我认为这种格式与 base 36 足够相似,我应该可以使用base_convert 来执行此操作,但我无法弄清楚如何。

【问题讨论】:

  • 如果你开始重用字符,你会如何扭转它......我的意思是,如果0 = 100 = 36,你怎么知道0011还是36
  • 所以你想转换n-1?
  • @crush 很容易用 base_convert 逆转 :)@beat 是的,但是 base_convert 返回 0 吗?
  • @MadMarvin 不,这不容易逆转。解释你在我给出的情况下使用的逻辑。我会等的。
  • 我认为您描述的不是有效的编号方案。您希望 1 映射到 0、10 映射到 9 等等。0 映射到什么?

标签: php string numbers base-conversion


【解决方案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 lines of output

此处显示 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);
}

【讨论】:

  • 这看起来非常完美。我明天看看。非常感谢你不只是另一个抨击者。真的很感激!
  • 祝你好运将这些转换回基数 10。
  • 我想我真正的问题是你没有基础,但想使用base_convert。你的基地是无限的。
  • 它适合所需的转换,但这不会转换为另一个基 - 它会转换为表示数字的字符串。
  • @crush 基数不是无穷大。没有基础。它是一个字符串表示,与 base 36 有相似之处。这就是 OP 所要求的。
【解决方案2】:

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

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

编辑:如果 1base 10 转换为 0你的特殊基数——你会用什么字符来表示 0?我认为您的系统不能用于有效的数字表示法。

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

【讨论】:

  • 似乎最好不要试图帮助这样的人。似乎他们只是想对任何不是读心术或没有完成不可能的人投反对票。
  • 我没有投反对票。别这么消极了,我问了,因为我自己也弄不明白。
  • @MadMarvin 失去态度?你问了一个措辞可怕的问题。在我们把它从你身上拖出来之前,你没有解决这个问题的担忧。然后你给了我们态度。你最初问的是不可能的。在清楚您根本没有尝试进行基本转换之后,问题变得可行。下一次,停下来想想你到底想要什么。当你弄清楚这一点时,清楚地说出来。这样你会得到更好的接待。如果你不愿意这样做,那就接受你收到的批评。欢迎来到 SO。
  • @crush 我知道我可以更清楚地表达自己,我接受批评,但是,Paulpro 理解了第一个帖子,这就是我的意思 - 他正确地解释了它。你没有。无需使用“无法完成”的 cmets 向整个问题发送垃圾邮件。显然可以做到,只是不是你想的那样。 (是的,我知道这本身不是“基本转换”,老实说我不在乎。)
  • @MadMarvin 你说的是基本转换为base36,但这是无法完成的,这使它成为一个糟糕的问题——它具有误导性。
猜你喜欢
  • 2012-08-22
  • 2018-05-01
  • 2018-07-24
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多