题目:Excel地址

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 <xxx>
不能通过工程设置而省略常用头文件。

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

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

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

歪歪有话说:

要是从字母序列转数字还好点,倒过来有点麻烦,不过计算机跑得快啊。

解析:

初读这道题,感觉挺简单的,不就是自定义一个进制系统么?后来才发现,我太低估这道题了。为什么说低估它了呢,听我细细到来.首先,按照我们传统的对二进制,八进制,十进制,十六进制数的传统思维做这道题,会陷入一个恶性循环的思维,这是这道题最大的难点,因为,你要注意到如果让你表示十进制的10和这道题的第27列,你怎么完成这个思维的过度呢,首先10是一个两位数,拆分为1和0,他们不一样,而用这道题的正确答案来表示27列是AA,拆分为A和A,他们一样,有人说,我用Z来表示在这道题中的进制系统中和十进制系统中10同样的地位(有人这听不懂了,这是一个思维过度,多看几遍,用笔划一下,就知道我说啥了),可是,10是双位数,Z是单位数. 以上的两种解法采取哪种合适呢,看题目,题目中说A表示1,AA表示27,并且有26个字母,恰好1 + 26 = 27,所以,我们果断选择第二种思维,同时也决定了,这道题采用的进制系统为26进制系统,但是我们在第二种方法还遗留了一个问题,更何况我们早已习惯二进制,八进制,十六进制,十进制系统中都有0的传统思维,这两个问题该怎么解决呢?一个办法,等效替代法,我们可以把Z看为进位的26(十进制系统中的10),并在主观上就认为Z是26进制系统中最小的两位数,Z就等效为A0即26 * 1 + 0 = 26,注意,这点尤为重要,而且必须理解,因为,该题没有给出表示第0列的标志,但是我们根深蒂固的思想导致很难处理没有0的其他进制系统的运算,所以,我们这里采用这样的做法这是这道题解的核心。下面给出数据对照表,方便大家更直观的理解本题的26进制系统:

源码:

#include<iostream>

using namespace std;

#define SUB 50
int sign[SUB] = {0};
int get_digits(int data);
void init_data(int data);
void view(int data[]);
void jud(int data);

int info;

int main(int argc,char** argv){

while(1){

printf("\n");
cin >> info;
init_data(info);
jud(info);
}

}

void jud(int data){

bool state = true;

for(int i = 0;i < get_digits(data);i++){

if(sign[i] == 0){

state = false;
}
}

if(state){

view(sign);

}else{

if(data == 26){

cout << "Z";

}else{

for(int i = get_digits(data) - 1;i >= 0;i--){

if(sign[i] == 0){

sign[i - 1] = sign[i - 1] - 1;
sign[i] = 26;
}
}

view(sign);
}
}
}

void init_data(int data){

int sub = 0;
int sub_temp = get_digits(data);

while(data){

sign[sub_temp - 1 - sub] = data % 26;
data = data / 26;
sub++;
}
}

int get_digits(int data){

int order = 1;

while(data / 26){

data = data / 26;
order++;
}

return order;
}

void view(int data[]){

for(int i = 0;i < get_digits(info);i++){

switch(data[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;
case 0:
cout << "Z";
default:
break;
}
}
}

2017蓝桥杯Excel地址(C++C组)的更多相关文章

  1. (Java实现)蓝桥杯Excel地址

    历届试题 Excel地址 原题地址 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, ...

  2. 2017蓝桥杯九宫幻方(C++B组)

    题目:九宫幻方    小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行.每一列和每一条对角线的和都是相同的. ...

  3. 2017蓝桥杯贪吃蛇(C++C组)

    原题: 贪吃蛇长度+-------------------------------------------------+|                                        ...

  4. 2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案

    2013第四届蓝桥杯决赛Java高职高专组题目以及解法答案 不知不觉离决赛都过去一个月了,一直忙于各种事情,都忘记整理一份试题.当作回忆也好. 1. 标题:好好学习 汤姆跟爷爷来中国旅游.一天,他帮助 ...

  5. 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版

    2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...

  6. 2017第八届蓝桥杯C/C++语言A组

    一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...

  7. 2017蓝桥杯等差素数(C++B组)

    题目 :                                            等差素数列 2,3,5,7,11,13,....是素数序列.类似:7,37,67,97,127,157 ...

  8. 2016第七届蓝桥杯C/C++语言A组

    一:问题: 某君新认识一网友.当问及年龄时,他的网友说:“我的年龄是个2位数,我比儿子大27岁,如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能情况? 提 ...

  9. 2018第九届蓝桥杯决赛(C++ B组)

    逛了大半个北京还是挺好玩de 第一题 标题:换零钞 x星球的钞票的面额只有:100元,5元,2元,1元,共4种. 小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱. ...

随机推荐

  1. vue基础----组件通信(props,$emit,$attrs,$listeners)

    一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. 2>在子组件中通过props声明希望用到的数据 <body> <div id= ...

  2. MVC超链接调用控制器内的方法

    <a href="hello/Layout?name=Tom"><h1><span>Hello</span>World</h1 ...

  3. LeetCode-最长回文串

    题目描述: 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意:假设字符 ...

  4. vue 阻止冒泡 @click.stop=

    vue 阻止冒泡 @click.stop= vue中处理冒泡标准姿势 事件修饰符 Vue.js 为 v-on 提供了事件修饰符,修饰符是由点开头的指令后缀来表示的.这些事件修饰符主要有以下几个: st ...

  5. 解决QQ“抱歉,无法发起临时会话,您可以 添加对方为好友以发送消息”

    很多网站,目前无法发起临时会话,自己在找网上找到教程,特分享给大家.自从2014年3月1日开始,网站上放置QQ客服代码的网站,在点击联系QQ时,以前可以正常发起临时会话的,现在提示:“抱歉,无法发起临 ...

  6. IDEA启动项目报错:Cannot open URL.Please check this URL is correct

    IDEA启动项目报错:Cannot open URL.Please check this URL is correct 问题:IDEA启动SSM项目,使用的Tomcat,报错 Cannot open ...

  7. 【Weiss】【第03章】练习3.26:双端队列

    [练习3.26] 双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作: Push(X,D):将项X插入到双端队列D的前端. Pop(D):从双端队列D中删除前端项并返回. ...

  8. shell编程学习之使用jq对json数据进行提取

    shell编程学习之使用jq对json提取 jq命令允许直接在命令行下对JSON进行操作,包括分片.过滤.转换等 ,jq是用C编写,没有运行时依赖,所以几乎可以运行在任何系统上.预编译的二进制文件可以 ...

  9. 全国职业技能大赛信息安全管理与评估-一些细节tips

    Base64加解密: ubuntu@VM-0-5-ubuntu:~$ echo iloveyou | base64aWxvdmV5b3UKubuntu@VM-0-5-ubuntu:~$ echo aW ...

  10. DRF 序列化组件 模型层中参数补充

    一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ...