资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
…
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。
样例输入
26
样例输出
Z
样例输入
2054
样例输出
BZZ
数据规模和约定
我们约定,输入的整数范围[1,2147483647]
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include
不能通过工程设置而省略常用头文件。
提交程序时,注意选择所期望的语言类型和编译器类型。
------------------------------
笨笨有话说:
这有点像进制关系,又不完全是。好像末2位是以1当26,末3位是以1当26*26
歪歪有话说:
要是从字母序列转数字还好点,倒过来有点麻烦,不过计算机跑得快啊。
分析与进制转换不完全一致。
#include<iostream>
using namespace std;
void bian(int i)
{
switch(i){
case 1:cout<<"A";break;
case 2:cout<<"B";break;
case 3:cout<<"C";break;
case 4:cout<<"D";break;
case 5:cout<<"E";break;
case 6:cout<<"F";break;
case 7:cout<<"G";break;
case 8:cout<<"H";break;
case 9:cout<<"I";break;
case 10:cout<<"J";break;
case 11:cout<<"K";break;
case 12:cout<<"L";break;
case 13:cout<<"M";break;
case 14:cout<<"N";break;
case 15:cout<<"O";break;
case 16:cout<<"P";break;
case 17:cout<<"Q";break;
case 18:cout<<"R";break;
case 19:cout<<"S";break;
case 20:cout<<"T";break;
case 21:cout<<"U";break;
case 22:cout<<"V";break;
case 23:cout<<"W";break;
case 24:cout<<"X";break;
case 25:cout<<"Y";break;
case 26:cout<<"Z";break;
}
}
int main()
{
long long int n;
cin>>n;
int s[1000];
long long int j=0;
while(n>0)
{
if(n%26==0)
{
s[j]=26;
j++;
n=n/26;
n--;
}
else
{
s[j]=n%26;
j++;
n=n/26;
}
}
for(int i=j-1;i>=0;i--)
bian(s[i]) ;
return 0;
}
写到这里,我发现代码比较繁琐,因此考虑ASCII码之间的关系,对代码就行缩减。代码如下:
#include<iostream>
using namespace std;
int main()
{
long long int n;
cin>>n;
int s[1000];
long long int j=0;
while(n>0)
{
if(n%26==0)
{
s[j]=26;
j++;
n=n/26;
n--;
}
else
{
s[j]=n%26;
j++;
n=n/26;
}
}
char c;
for(int i=j-1;i>=0;i--)
{
c=s[i]+'A'-1;
cout<<c;
}
return 0;
}
这样代码的数量将会大大降低,节约一些时间。