您的位置:首页 > 其它

第八届蓝桥杯c组省赛第七题--Excel地址

2018-03-15 09:59 369 查看
标题: Excel地址

Excel单元格的地址表示很有趣,它使用字母来表示列号。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
....

当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?

本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。

例如,
输入:
26
则程序应该输出:
Z

再例如,
输入:
2054
则程序应该输出:
BZZ
2147483647

我们约定,输入的整数范围[1,2147483647]

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

------------------------------

笨笨有话说:
    这有点像进制关系,又不完全是。好像末2位是以1当26,末3位是以1当26*26

歪歪有话说:
    要是从字母序列转数字还好点,倒过来有点麻烦,不过计算机跑得快啊。#include<stdio.h>
int a[10000]; //储存余数
char c[]="ZABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main(){
int n,r; //r为余数
int i=0,j;

scanf("%d",&n);

while(n>0){
r=n%26;
if(r==0) r=26;
a[i++]=r;
n=(n-r)/26;
}
i--;
while(i>=0){
printf("%c",c[a[i]]);
i--;
}
return 0;
}
-------------------------------------------------------------------------------------------------------#include<stdio.h>
#include<string.h>
int main(){
int m,ys=0,n,i=0;
int a[10000];
scanf("%d",&m);
while(m>0){
ys=m%26;
if(ys==0)ys=26;
a[i++]=ys;
m=(m-ys)/26;
}
i=i-1;
while(i>=0)
{
switch(a[i]){
case 1:printf("%c",'A');break;
case 2:printf("%c",'B');break;
case 3:printf("%c",'C');break;
case 4:printf("%c",'D');break;
case 5:printf("%c",'E');break;
case 6:printf("%c",'F');break;
case 7:printf("%c",'G');break;
case 8:printf("%c",'H');break;
case 9:printf("%c",'I');break;
case 10:printf("%c",'J');break;
case 11:printf("%c",'K');break;
case 12:printf("%c",'L');break;
case 13:printf("%c",'M');break;
case 14:printf("%c",'N');break;
case 15:printf("%c",'O');break;
case 16:printf("%c",'P');break;
case 17:printf("%c",'Q');break;
case 18:printf("%c",'R');break;
case 19:printf("%c",'S');break;
case 20:printf("%c",'T');break;
case 21:printf("%c",'U');break;
case 22:printf("%c",'V');break;
case 23:printf("%c",'W');break;
case 24:printf("%c",'X');break;
case 25:printf("%c",'Y');break;
case 26:printf("%c",'Z');break;
}
i--;
}
return 0;
} 扩展:
26进制转换10进制#include<stdio.h>
#include<string.h>
#include<math.h>
int main(){
int m,ys=0,n,i=0;
int a[10000];
char c[10000];
double sum=0;

scanf("%s",c);
n=strlen(c);

/* 字符数组c的各元素
for(int j=0;j<strlen(c);j++){
printf("%c\t",c[j]);
}
puts("");
*/
while(--n>=0)
{
switch(c[i]){
case 'A':a[i]=1;break;
case 'B':a[i]=2;break;
case 'C':a[i]=3;break;
case 'D':a[i]=4;break;
case 'E':a[i]=5;break;
case 'F':a[i]=6;break;
case 'G':a[i]=7;break;
case 'H':a[i]=8;break;
case 'I':a[i]=9;break;
case 'J':a[i]=10;break;
case 'K':a[i]=11;break;
case 'L':a[i]=12;break;
case 'M':a[i]=13;break;
case 'N':a[i]=14;break;
case 'O':a[i]=15;break;
case 'P':a[i]=16;break;
case 'Q':a[i]=17;break;
case 'R':a[i]=18;break;
case 'S':a[i]=19;break;
case 'T':a[i]=20;break;
case 'U':a[i]=21;break;
case 'V':a[i]=22;break;
case 'W':a[i]=23;break;
case 'X':a[i]=24;break;
case 'Y':a[i]=25;break;
case 'Z':a[i]=26;break;
}
i++;
}
/*数组a的各元素
for(int j=0;j<strlen(c);j++){
printf("%d\t",a[j]);
}
puts("");
*/
for(int j=0;j<strlen(c);j++){
sum+=a[j]*pow(26,strlen(c)-1-j);
}
printf("%.0lf\n",sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: