序号互换
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来。单元格的行坐标是由数字编号的数字序号,而列坐标使用字母序号。观察字母序号,发现第1列到第26列的字母序号分别为A,B,…,Z,接着,第27列序号为AA,第28列为AB,依此类推。
若给Dr.Kong的机器人卡多一个数字序号(比如32),它能很快算出等价的字母序号(即AF),若给机器人一个字母序号(比如AA)),它也能很快算出等价的数字序号(27),你能不能与卡多比试比试,看谁能算得更快更准确。
-
输入
-
第一行: N 表示有多少组测试数据。
接下来有N行, 每行或者是一个正整数,或者是一个仅由大写字母组成的字符串。
输入保证,所有数字序号和字母序号对应的数字序号均 ≤ 2*10^9
-
输出
-
对于每一行测试数据,输出一行。如果输入为一个正整数序号,则输出等价的字母序号;如果输入为字符串,则输出等价的数字序号。
-
样例输入
-
3
27
G
AA
-
样例输出
-
AA
7
27
-
来源
-
第四届河南省程序设计大赛
-
上传者
张云聪
题意就是进制之间的转化
#include <cstdio>
#include <cstring>
#include <cmath>
char a[1000];
char ans[10000];
int main()
{
int t;
for(scanf("%d", &t); t--;)
{
scanf("%s", a);
int len = strlen(a);
if(a[0] >= '0' && a[0] <= '9')//判断数字转化为字母。
{
int sum = 0;
for(int i = 0; i < len; i++)
{
sum = sum * 10 + a[i] - '0';
}//把字符串转化为数字。
int L = 0;
while(sum != 0)
{
if(sum % 26 == 0)//判断此时是不是为Z
ans[L] = 26;
else
ans[L] = sum % 26;
sum= (sum - 1) / 26;//进一次为就要-1;因为26/26=1;
L++;
}
for(int i = L - 1; i >= 0; i--)
{
printf("%c", ans[i] + 'A' - 1);
}
printf("\n");
}
else
{
double K = 0;
for(int i = 0; i < len; i++)
{
K += (a[i] - 'A' + 1) * pow(26.0, double(len - 1 - i));
}//和二进制转化为26进制转化为十进制一样。
printf("%.lf\n", K);
}
}
return 0;
}