历届试题 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地址表示方式。
样例输入
26
样例输出
Z
样例输入
2054
样例输出
BZZ
数据规模和约定
我们约定,输入的整数范围[1,2147483647]
题目分析
这个题有点像进制转换,但是又有不同,不同之处在于,他没有‘0’。
举个例子,1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 21 22 23 24……
上面的例子,他没有含有0的任何数字。
第一步:我们先把9变成九进制 10
第二步:如果某位数字为0,那么则向前借位,10就变成了09
那么答案就是9
对应到我们这个题上,无非就是九进制变成了二十六进制。
对应到我们这个题上,无非就是九进制变成了二十六进制。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <stdlib.h> #include <cstdlib> #include <string.h> #include <string> #include <cmath> #include <map> using namespace std; int n; char s[1000]; int main() { cin >> n; _itoa(n, s, 26);//转换进制 for (int i = 0; s[i] != '\0'; i++) {//把字母变成数字 if (s[i] <= 'z'&&s[i] >= 'a') { s[i] = s[i] - 'a' + 10 + '0'; } } int len = strlen(s); for (int i = len - 1; i >= 0; i--) { if (s[i] - '0' <= 0 && i != 0) s[i - 1] -= 1, s[i] += 26; if (s[i] - '0' > 0) s[i] += 'A' - '0' - 1; } char *p = s; while (*p - '0' <= 0)//找到第一位非0数字 p++; cout << p; return 0; }