Excel列名和列序号转换(26进制与10进制的转换)
程序员文章站
2022-03-14 10:00:57
...
大家有没有留意过Excel表格中列名的规律呢?是这样的:
A B C ... Y Z AA AB AC ... AY AZ BA BB BC ... BY BZ ... ZZ ... AAA ...
如果没看懂,请打开Excel程序仔细观察一下~~
每一列都是有序号的,从1开始编号,即:列A B C ... Y Z AA AB ... 的编号依次是 1 2 3 ... 25 26 27 28 ...
现在,请编写程序,按照上述规律,把输入的列名和列序号进行相互转换(不用考虑Excel软件实际允许的最多列数)。
输入格式:
输入由若干行组成,每行的内容是以下三种之一:
长度不超过6的由大写字母组成的字符串,表示一个列名
不超过9位数字的正整数,表示一个列序号
符号#,表示输入结束
输出格式:
对于在输入结束符#之前出现的每一行输入,若输入为列名,在一行内打印对应的列序号;若输入为列序号,在一行内打印对应的列名。
输入样例:
A
3
AB
29
#
输出样例:
1
C
28
AC
代码:
#include<iostream>
using namespace std;
int main(){
string s;
while(cin>>s){
char a[25];
int flag=0;
if(s=="#") break;
int num=0;
int cnt=0;
for(int i=0;i<s.length();i++){
if(s[i]>='0'&&s[i]<='9'){
num=num*10+s[i]-'0';
}
else{
flag=1;
num=num*26+s[i]-'A'+1;
}
}
if(flag){
cout<<num<<endl;
}
else{
while(num){
if(num%26==0){
a[cnt]='A'+25;
cnt++;
num/=26;
num--;
}
else{
a[cnt]='A'+num%26-1;
num/=26;
cnt++;
}
}
for(int j=cnt-1;j>=0;j--){
printf("%c",a[j]);
}
cout<<endl;
}
}
return 0;
}
上一篇: 【华为】2019校招(字符串解压缩,26进制和10进制相互转换)
下一篇: PHP VS ASP