写一个函数,0->A,1->B,...,25->Z,26->AA,27->AB
1000 -> ALM
10000 -> NTQ
100000 -> EQXE
1000000 -> BDWGO
10000000 -> UVXWK
100000000 -> HJUNYW
1000000000 -> CFDGSXM
以此类推
[解决办法]
function InttoAZ(i:Integer):string;var intTemp:integer;begin Result := ''; intTemp := i; if intTemp < 26 then Result := chr(intTemp+$41) else Result := InttoAZ(intTemp div 26 - 1) + InttoAZ(intTemp mod 26);end;function AZtoInt(s:string):integer;var strTemp:string;begin strTemp := s; result := 0; while Length(strTemp)>0 do begin result := result * 26 + (Ord(strTemp[1]) - $41); if Length(strTemp) > 1 then result := result + 1; strTemp := Copy(strTemp,2,Length(strTemp)-1); end;end;
[解决办法]
这个是ACM的一道题,几年前做过。。。。
这个东东需要用到大数,楼主的最后一句话以此类推,那就说明32位整数是放不下的。。
题目相当于26进制与10进制互相转化。。。
[解决办法]
实际就是26进制,如果不考虑溢出还是很简单的
[解决办法]
http://topic.csdn.net/u/20120708/13/bc3a55c2-8a98-44e8-a7aa-a7a0831808bc.html
刚写了一个,和你的很类似,唯一和你不一样的地方就是
a -> 1
b -> 2
z -> 26
aa -> 27
和你的总是相差1
你把需要替换的数字 +1 作为输入,就能得到想要转化的单词
同理 输入单词,得到的数字 -1 就是你想要的结果
代码贴一下~
#include <stdio.h>#include <string.h>#define N 128typedef unsigned short u_16;//输入函数void input( u_16 *l, const char *s ){ //将数字字符串替换成 u_16数组,方便函数计算 memset( l, 0, N*sizeof(u_16) ); char ts[N] = {0}; strcpy( ts, s ); int len = strlen( s ); int x = len % 3; int y = (len-1) / 3 ; if( x == 0 ) x = 3; for( int i = y; i > 0; --i ) { //循环放入u_16数组 ts[i*3+x] = 0; sscanf( ts+i*3-3+x, "%d", l+y-i ); } //写字符串的前x个数字(即u_16数组中的最后一个元素) ts[x] = 0; sscanf( ts, "%d", l+y ); }//输出函数void output( u_16 *l ){ int i; for( i = N-1; i >= 0; --i ) if( l[i] ) break; for( ; i >= 0; --i ) printf( "%03d,", l[i] ); //%03d, 可以去掉这个逗号 printf( "\n" );}//字母转数字void Al2Num( const char *s, u_16 *l ){ int len = strlen( s ); int w = 0; //进位 for( int i = 0; i < len; ++i ) { int c = (s[i]&0x5f) - 'A'; //小写字母转大写 for( int j = 0; j < N; ++j ) //大数乘以26并进位 { l[j] *= 26; l[j] += w, w = 0; if( j == 0 ) l[j] += c+1; // a -> 1, z -> 26 if( l[j] >= 1000 ) w = l[j] / 1000, l[j] %= 1000; } }}//数字转字母void Num2Al( const u_16 *l, char *s ){ u_16 tl[N] = {0}; char ts[N] = {0}; memcpy( tl, l, N*sizeof(u_16) ); int i, t = 0, w = 0; for( i = N-1; i >= 0; --i ) //找到第一个不是0的元素 if( tl[i] ) break; while( i >= 0 ) //进制转化 { for( int j = i; j > 0; --j ) { tl[j-1] += tl[j] % 26 * 1000; tl[j] /= 26; } w = tl[0] % 26; tl[0] /= 26; if( w == 0 ) { if( tl[0] || i ) tl[0] -= 1; ts[t++] = 'z'; } else ts[t++] = 'a' + w - 1; if( tl[i] == 0 ) --i; } //字符串倒置赋值 int len = strlen( ts ); for( i = 0; i < len; ++i ) s[len-i-1] = ts[i]; s[len] = 0;}//主函数int main(){ u_16 num[N] = {0}; char al[N] = "BDWGO"; Al2Num( al, num ); //测试输出 printf( "%s\n", al ); output( num ); u_16 num2[N] = {0};//{ 520, 456, 854, 823, 636, 622, 11, 28 }; input( num2, "28011622636823854456520"); char al2[N] = ""; Num2Al( num2, al2 ); output( num2 ); printf( "%s\n", al2 );}
[解决办法]
10进制 -> 26进制
[解决办法]
26进制
[解决办法]
5楼可作参考,楼主可以去搜搜。