很早以前在别人博客里看到的题目:
用过excel的都知道excel的列编号是这样的:
a b c .... z aa ab ac .... az ba bb bc .... yz za zb zc .... zz aaa aab aac ....
分别代表以下编号:
1 2 3 .... 26 27 28 29 .... 52 53 54 55 .... 676 677 678 679 .... 702 703 704 705 ....
请写个函数,完成从一个正整数到这种字符串之间的转换。
用递归写了个程序:
/*
函数的作用就是通过递归调用返回某一位上的字符,并打印比这一位高一位的字符,从第一位字符开始。
如果想打印第一位,则必须先打印出第二位,如果想打印第二位,则需要先打印第三位,直到高位不存在。
程序对所给数字用26整除,余数即为某一位上所对应的字母。如果遇到除尽的情况(边界问题,除尽说明此位不对应任何字母),
则直接向高位上借1(实际上是借一个字母),即在本位上加上26(字符z),如果高位还能借出的话,高位减去1(实际上是减去一个字母),
不能借出或者借出后高位不再对应字母,则整个过程结束。
*/
int f(unsigned long p)
{
if(p==0)return 0;
if(p<=26)return 'a'+p-1;
if(p>26)
if(p%26==0)//余数为0则需要向高位借
{
//向高位借1,所以高位需要减1,如果高位借出后为0或直接无法借出,说明高位没有
if(p/26<=1)//高位借出后为0或直接无法借出
return 'z';//返回这一位上的字符
else//高位借出后仍存在
{
printf("%c",f(p/26-1));//先打印高位上的字符
return 'z';//再返回这一位上的字符
}
}
else
{
if(p/26!=0)//高位仍然存在
{
printf("%c",f(p/26));//先打印高位字符
return 'a'+p%26-1;//再返回这一位上的字符
}
else//已不存在更高位
return 'a'+p%26-1;//返回这一位上的字符
}
}
int main(int argc, char* argv[])
{
unsigned long tmpinput;
while(1)
{
printf("Enter a number:");
scanf("%ld",&tmpinput);
printf("%c",f(tmpinput));
printf("/nContinue?/n");
tmpinput=getch();
if(tmpinput!='y'&&tmpinput!='Y')break;
}
return 0;
}