欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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