[蓝桥杯2017初赛]Excel地址
题目描述
Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
比如,A表示第1列,B表示第2列,Z表示第26列,AA表示第27列,AB表示第28列,BA表示第53列,....
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。
输入
输入存在多组测试数据,对于每组测试数据输入一行包含一个整数
输入的整数范围[1,2147483647]
输入的整数范围[1,2147483647]
输出
对于每组测试数据:输出一行表示答案
样例输入 Copy
26
2054
样例输出 Copy
Z
BZZ
题解:就是将十进制转换为26进制,区别在于26进制数没有26这个数,但是这里有,所以26这个数要特殊处理:
在26进制数中,26是用两位数表示,这里只用一位数‘Z’就可以表示,所以对n取模整除之后的数减一就行
#include<iostream> #include<string> #include<algorithm> #include<math.h> #include<string.h> #include<map> #include<stack> #define ll long long using namespace std; int main() { ll n; while(cin>>n) { stack<char>p; while(n) { if(n%26==0)//因为26进制里面没有26这个数,但是地址里面有,所以要用这种形式存进去 { p.push('Z'); n=n/26; n--;//存进去之后,数要减一(以26举例,26进制数26用两位数表示,但这里只用一位数就可以表示) } else { p.push((char)('A'+n%26-1)); n=n/26; } } while(!p.empty()) { cout<<p.top(); p.pop(); } cout<<endl; } return 0; }
等风起的那一天,我已准备好一切