好久沒有做過算法相關的東西了,最近一個同事問了一個算法相關的問題,問題描述如下:
有這樣一組排列對應關係,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";
}