PHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等
Posted
技术标签:
【中文标题】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 【发布时间】:2011-07-30 02:08:10 【问题描述】:我正在尝试编写一个将整数转换为这样的字符串的函数,但我无法弄清楚逻辑... :(
1 = a
5 = e
27 = aa
28 = ab
etc...
有人可以帮忙吗?我真的很生气,我无法思考如何写这个...... :(
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于PHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等的主要内容,如果未能解决你的问题,请参考以下文章