首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

写一个函数,0->A,1->B,25->Z,26->AA,27->AB,该如何解决

2012-09-15 
写一个函数,0-A,1-B,...,25-Z,26-AA,27-AB1000 - ALM10000 - NTQ100000 - EQXE1000000 - BDWGO10

写一个函数,0->A,1->B,...,25->Z,26->AA,27->AB
1000 -> ALM
10000 -> NTQ
100000 -> EQXE
1000000 -> BDWGO
10000000 -> UVXWK
100000000 -> HJUNYW
1000000000 -> CFDGSXM
以此类推

[解决办法]

Delphi(Pascal) code
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 就是你想要的结果

代码贴一下~
C/C++ code
#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楼可作参考,楼主可以去搜搜。

热点排行