第八届蓝桥杯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;
}
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;
}
相关文章推荐
- 蓝桥杯第八届省赛JAVA真题----Excel地址
- 2017第八届蓝桥杯 07 Excel地址(java)
- 【蓝桥杯】【Excel地址转换】
- 第八届 蓝桥杯 c/c++ B组 省赛 (3)——承压计算
- 第八届 蓝桥杯 c/c++ B组 省赛 (4)——方格分割
- 蓝桥杯历届试题Excel地址
- 蓝桥杯第九届省赛:第七题 螺旋折线
- 2017第八届蓝桥杯Java省赛有感
- 蓝桥杯第八届省赛JAVA真题----日期问题
- 匪夷所思的错误-16年蓝桥杯A组省赛的第七题-剪邮票
- 第八届蓝桥杯省赛B组c++_日期问题
- 第八届蓝桥杯JAVA B组【省赛】
- 第八届蓝桥杯JavaA组第七题正则问题
- 蓝桥杯--Excel地址
- 2017第八届蓝桥杯Java B组省赛第一题:购物单
- 蓝桥杯第八届省赛JAVA真题----字母组串
- 第八届蓝桥杯 省赛B组第三题承压计算
- 第八届蓝桥杯B组java省赛 日期问题
- 第八届 蓝桥杯 c/c++ B组 省赛 (9)——分巧克力
- 第八届蓝桥杯省赛(大学B组 C/C++) 第七题