【发布时间】:2011-07-30 02:08:10
【问题描述】:
我正在尝试编写一个将整数转换为这样的字符串的函数,但我无法弄清楚逻辑... :(
1 = a
5 = e
27 = aa
28 = ab
etc...
有人可以帮忙吗?我真的很生气,我无法思考如何写这个...... :(
【问题讨论】:
我正在尝试编写一个将整数转换为这样的字符串的函数,但我无法弄清楚逻辑... :(
1 = a
5 = e
27 = aa
28 = ab
etc...
有人可以帮忙吗?我真的很生气,我无法思考如何写这个...... :(
【问题讨论】:
一长串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;
}
【讨论】:
我将添加这个答案来总结 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"。
【讨论】:
您必须使用 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 来表示。从 base-10 转换很容易 - 参见例如这个:http://www.mathsisfun.com/base-conversion-method.html
罢工>
编辑:实际上,base-26 无法解释多种等效的写入 0 的方式(0 = 00 = 000)。
【讨论】:
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;
}
【讨论】: