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


PHP: How to output list like this: AA, AB, AC, all the way to ZZZY, ZZZZ, ZZZZA etc

我试图写一个函数,将一个整数转换成这样的字符串,但我不能找出逻辑…(

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

有人能帮忙吗?我真的不知道该怎么写这个……(

这里有很长的列表:

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

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

当遇到这个问题时,一个常见的第一反应是认为"有26个字母,所以这个一定是26!"我所需要做的就是将每个字母映射到对应的数字"

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

在26进制中,26是第一个有两位数字的数,写为"10"。在这个计数系统中,26有一个单位数"Z",第一个两位数是27。

但是如果我们让A=0,…, Z = 25 ?这样我们得到一个0,第一个两位数变成了26。到目前为止一切顺利。26现在怎么写呢?这就是"AA"。但是…不是= 0 ?糟糕!A = AA = AAA = "0" = "00" = "000".

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

base_convert(35, 10, 26);

这给了你1 - p的单个组件的数字,所以35变成19(1 * 26 + 9)。然后你必须将单个组件映射到你想要的集合,所以1 => a, 9 => i, a => j,等等,19变成ai

好吧,你基本上是从10进制转换到26进制。基数10有0-9,而基数26可以用"数字"A-Z来表示。从10进制转换很容易,例如:http://www.mathsisfun.com/base-conversion-method.html>

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