Excel的列编号问题

很早以前在别人博客里看到的题目:


用过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;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值