【问题标题】:PHP: How to output list like this: AA, AB, AC, all the way to ZZZY, ZZZZ, ZZZZA etcPHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等
【发布时间】:2011-07-30 02:08:10
【问题描述】:

我正在尝试编写一个将整数转换为这样的字符串的函数,但我无法弄清楚逻辑... :(

1 = a
5 = e
27 = aa
28 = ab
etc...

有人可以帮忙吗?我真的很生气,我无法思考如何写这个...... :(

【问题讨论】:

    标签: php algorithm logic


    【解决方案1】:

    一长串here:

    /*
     * Convert an integer to a string of uppercase letters (A-Z, AA-ZZ, AAA-ZZZ, etc.)
     */
    function num2alpha($n)
    {
        for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
            $r = chr($n%26 + 0x41) . $r;
        return $r;
    }
    
    /*
     * Convert a string of uppercase letters to an integer.
     */
    function alpha2num($a)
    {
        $l = strlen($a);
        $n = 0;
        for($i = 0; $i < $l; $i++)
            $n = $n*26 + ord($a[$i]) - 0x40;
        return $n-1;
    }
    

    【讨论】:

    • +1。虽然您需要在 num2alpha 中从 $n 的初始值中减去 1,而不是在 alpha2num 中最后减去 1,以匹配 1 = A 的 OP 规范。
    • 好调用 -- 代码直接取自 php.net 站点,作为该概念的良好参考
    • 为什么它不适用于像这样的大量数字:num2alpha(20160504123435)?
    【解决方案2】:

    我将添加这个答案来总结 cmets 关于滥用 base-26 的问题。

    当遇到这个问题时,一个常见的第一反应是想“有 26 个字母,所以这必须是 base-26!我需要做的就是将每个字母映射到它对应的数字” .

    但这不是base-26。很容易看出原因:没有零!

    在 base-26 中,数字二十六是第一个有两位数的数字,写成“10”。在这个计数系统中,二十六有一个数字“Z”,第一个两位数是二十七。

    但是如果我们让 A=0, ..., Z=25 呢?这样我们就有了一个零,第一个两位数变成了二十六。到目前为止,一切都很好。我们现在怎么写二十六?那是“AA”。但是……不是A=0吗?哎呀! A = AA = AAA = "0" = "00" = "000"。

    【讨论】:

    • 只是想把我的头包起来。如果 A=0,26 不只是 BA,而不是 AA。
    • @Paystey 是的,如果 这是 base-26。但是这个方案中25(Z)后面的数字是AA。
    • 是的,没错,我只是想让我的头脑完全了解 base 26。有用。但事实并非如此。谢谢。
    【解决方案3】:

    您必须使用 base_convert 将您的数字转换为 26 进制:

    base_convert(35, 10, 26);
    

    这为您提供了 1 - p 中的各个分量,因此 35 变为 19 (1 * 26 + 9)。然后您必须将各个组件映射到所需的集合,因此 1 => a、9 => i、a => j 等,19 变为 ai

    【讨论】:

    • 问题是,26 => 1 * 26 + 0 => 10 以 26 为底。哎呀,你如何映射 0?不,这种类似于 Excel 的计数不是以 26 为基数
    • @Martinho Fernandes 很有趣,你是对的,根本没有根据。我想知道 OP 如何占 0...
    【解决方案4】:

    嗯,你几乎可以从 10 进制转换为 26 进制。10 进制有数字 0-9,而 26 进制可以用“数字”A-Z 来表示。从 base-10 转换很容易 - 参见例如这个:http://www.mathsisfun.com/base-conversion-method.html 罢工> 编辑:实际上,base-26 无法解释多种等效的写入 0 的方式(0 = 00 = 000)。

    【讨论】:

    • 不,不是。比如说,“数字”A 等价于“数字”1,B 是 2,以此类推。所以我们有 1,2,3,4,...,Z,11,12,13,...,1Z,21。不好。好的,让我们试试 A = 0, B = 1 等。我们有 0,1,2,3,4,...,Z,00,01,02,...,0Z,10,。不,根本不是 base-26。
    • @Martinho Fernandes:我确实不是说base-36,也不是0-9+A-Z;你似乎正在使用它。请告诉我,英文字母表中有多少个字母,从 A 到 Z?上次我检查时,有 26 个。 A = 1,B = 2, C = 3, ..., X = 24, Y = 25, Z = 26, AA = 27 ( 26^1 *A + 26^0 *A ), AB = 28 ( 26 ^1 * A + 26^0 * A ), AC = 29, AD = 30 等等。你可能对使用 0-9+AF 的 base-16 感到困惑,这是一个稍微不同的情况。跨度>
    • 你错过了我的意思:1,2,3,4,...,,11,12,13。您只是错过了数字“10”(又名 26)!请看,以 26 为底,数字 26 有 两位数,就像以 2 为底的 2 和以 10 为底的 10。
    • @Martinho Fernandes:看来我确实错过了。如果A = 0,那么A = AA = AAA = AAAA = AAAAAA = 0。你说得对,谢谢你的指正。
    【解决方案5】:
    void convert(int number)
    {
    
            string str = "";
    
        while(number)
        {
            char ch;
            ch = (number - 1) % 26 + 65;    
            str = ch + str;
            number = (number-1) / 26;
        }
    
        cout << str << endl;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-03
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 2019-08-02
      • 2016-09-25
      相关资源
      最近更新 更多