PHP:如何输出这样的列表:AA,AB,AC,一直到ZZZY,ZZZZ,ZZZZA等

时间:2011-04-05 15:29:08

标签: php algorithm logic

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

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

有人可以帮忙吗?我真的很不高兴我无法解决如何写这个...... :(

5 个答案:

答案 0 :(得分:19)

他们的长列表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 :(得分:6)

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

遇到这个问题时,常见的第一反应是认为“有26个字母,所以这必须是26个!我需要做的就是将每个字母映射到相应的数字”

但这不是基础26。很容易理解为什么:没有零!

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

但是如果我们做A = 0,......,Z = 25怎么办?这样我们得到零,第一个两位数字变为二十六。到现在为止还挺好。我们现在怎么写二十六个?这是“AA”。但是......不是A = 0?哎呀! A = AA = AAA =“0”=“00”=“000”。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您必须使用base_convert将您的号码转换为26个基数:

base_convert(35, 10, 26);

它为您提供了来自1 - p的数字中的各个组成部分,因此35变为19(1 * 26 + 9)。然后你必须将各个组件映射到你想要的组,所以1 =&gt; a,9 =&gt;我,a =&gt; j等,而19变为ai

答案 4 :(得分:0)

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;
}