?php
$str="aa";//写你想要算的字符串;
$v;
function getv($s){
$arr=str_split($s,1);
for ($i=0;$istrlen($s);$i++)
{
$v=gett($arr[$i])*getw(strlen($s)-$i-1)+$v;
}
echo $v;
}
function getw($w){
$x=1;
for ($i=0;$i$w;$i++){
$x=26*$x;
}
return $x;
}
function gett($ch){
return (ord($ch)-96);
}
echo getv($str);
?
aa,刚好就是27.你试试吧
先26禁止那么就需要26个符号,可以用0~9加上16个字符。
这里为了方便直接取26个英文字母。A表示0,B为1,,,,一直到Z表示25.
2092 7887 2115/26=8049 1873 89余1
8049 1873 89 /26=309584130 余9
309584130 /26=11907081 余24
11907081 /26=457964 余17
457964 /26=17614 余0
17614/26=677余12 677/26=26余1 26/26=1余0 1/26=0余1
对应的 为:01 00 01 12 00 17 24 09 01
转为字母: BABLAQXIB
十进制和26进制转换算法:
/// summary
/// 将指定的自然数转换为26进制表示。映射关系:[1-26] -[A-Z]。
/// /summary
/// param name="n"自然数(如果无效,则返回空字符串)。/param
/// returns26进制表示。/returns
public static string ToNumberSystem26(int n){
string s = string.Empty;
while (n 0){
int m = n % 26;
if (m == 0) m = 26;
s = (char)(m + 64) + s;
n = (n - m) / 26;
}
return s;
}
/// summary
/// 将指定的26进制表示转换为自然数。映射关系:[A-Z] -[1-26]。
/// /summary
/// param name="s"26进制表示(如果无效,则返回0)。/param
/// returns自然数。/returns
public static int FromNumberSystem26(string s){
if (string.IsNullOrEmpty(s)) return 0;
int n = 0;
for (int i = s.Length - 1, j = 1; i = 0; i--, j *= 26){
char c = Char.ToUpper(s[i]);
if (c 'A' || c 'Z') return 0;
n += ((int)c - 64) * j;
}
return n;
}
static void Main(string[] args){
int[] numbers = { 1, 10, 26, 27, 256, 702, 703 };
foreach (int n in numbers){
string s = ToNumberSystem26(n);
Console.WriteLine(n + "\t" + s + "\t" + FromNumberSystem26(s));
}
Console.ReadLine();
}
扩展资料
需要不同进制的原因:
二进制是因为计算机只能表示两个状态0,1,(0好比开关关,1可以表示成开关接通)。所以计算机只能“认识”二进制数。二进制“逢二进一”。
人类用十进制,计算机用二进制,但如果想要更好的去研究和理解计算机的运作时,光用二进制表达和描述会非常不直观、不方便。因为二进制太长了,比如一个整数(十进制),32位机中二进制有32位。
如果用十六进制就只要8位,表达和描述上会方便很多,互转时也可以直接转,不像十进制哪样复杂。(因为8,16,是2的3,4次方)
十六进制转二进制,一位转四位,反过来是四位转一位;八进制转二进制,一位转三位,反过来是三位转一位。