好久没有做过算法相关的东西了,最近一个同事问了一个算法相关的问题,问题描述如下:
有这样一组排列对应关系,26个大写字符组成的字符串按字符序排序,短的比较小
例
A=>1,B=>2,。。。Z=>26,AA=>27,。。。AZ=52 。。。
现在给出数字m,要找出对应的字符串是什么,如下
1 => A , 27 => AA ...
这个问题比较熟悉,以前遇到过,不过当时自己怎么解决的就想不起来了。
现在的解法如下:
大致思路
10进制变26进制
多项式 :m = x1*26^n + x2*26^n-1+...+xn*26^0(注意:1<= xi <= 26)
代码:
<?php
$a = intval($argv[1]);
function ans($a)
{
$arr = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$res = 0;
$len = strlen($a);
for($i = 0; $i<$len; $i++) {
$res = $res*26 + (ord($a[$i]) - ord('A') + 1);-
}
return $res;
}
function func($a)-
{
$arr = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$res = '';
while($a > 0) {
$x = $a%26;
if($x == 0) { #这里要注意
$x = 26;
}
$res = $arr[$x].$res;
$a -= $x; #这要注意
$a = intval($a/26);
}
return $res;
}
$b = func($a);
$j = ans($b);
echo $a,"\n",$b,"\n",$j,"\n";
if($a != $j){
echo "algorithm error\n";
}else{
echo "succ\n";
}