题目链接

题目大意:

人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:

第一列被标为 A,第二列为 B,以此类推,第 262626 列为 Z。接下来为由两个字母构成的列号: 第 272727 列为 AA,第 282828 列为 AB ⋯\cdots⋯ 在标为 ZZ 的列之后则由三个字母构成列号,如此类推。

行号为从 1 开始的整数。

单元格的坐标由列号和行号连接而成。比如,BC23 表示位于第 55 列 23 行的单元格。

有时也会采用被称为 RXCY 的坐标系统,其中 X 与 Y 为整数,坐标 (X,Y) 直接描述了对应单元格的位置。比如,R23C55 即为前面所述的单元格。

您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

解题思路:

  1. 首先判断是哪一种表示方法,我用的类似于枚举样式:

    bool check()
    {
    int n;
    n = strlen(s);
    if(s[0] == 'R')
    {
    int j = 1;
    while(check_count(s[j]) && j < n) j ++ ;
    if(j == 1) return false; if(s[j] == 'C') return true;
    } return false;
    }
  2. 写转换函数change1/change2:
    void change1()
    {
    string a1 = "", a2 = "";
    int n = strlen(s);
    int i = 1;
    for ( ; i < n; i ++ )
    {
    if (!check_count(s[i])) break;
    a1 += s[i];
    }
    int res = 0;
    i ++;
    for( ; i < n; i ++ )
    {
    res = res * 10 + s[i] - '0';
    } while (res)
    {
    char p;
    int t = res % 26;
    if(!t)
    p = 'Z';
    else
    p = t - 1 + 'A';
    a2 = p + a2 ;
    if(!t) res = res / 26 - 1;
    else res = res / 26;
    } cout << a2 << a1 << '\n';
    } void change2()
    {
    int n;
    n = strlen(s);
    int i = 0;
    string s1 = "R", s2 = "C";
    for( ; i < n; i ++ )
    {
    if(check_count(s[i])) break;
    } for( ; i < n; i ++ )
    {
    s1 += s[i];
    } string t = "";
    for(int i = 0; i < n; i ++ )
    {
    if (check_count(s[i])) break;
    t += s[i];
    } int res = 0;
    for(int i = 0; i < t.size(); i ++ )
    {
    res = res * 26 + t[i] - 'A' + 1;
    } string tt = to_string(res);
    s2 += tt;
    cout << s1 << s2 << '\n';
    }

本题踩的坑:

首先这个26进制非我们常见的二进制,他不可以出现0.就。出现0代表他是“Z”,还有我们不能使其是26的倍数,这里用一个特判,如果是26的倍数,我们将其减一就好了。如:

while (res)
{
char p;
int t = res % 26; //0代表他是最后一个字母
if(!t)
p = 'Z';
else
p = t - 1 + 'A';
a2 = p + a2 ;
if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0
else res = res / 26;
}

本题AC代码:

#include <bits/stdc++.h>

using namespace std;

char s[100];

bool check_count(char a)
{
if (a >= '0' && a <= '9') return true;
return false;
} void change1()
{
string a1 = "", a2 = "";
int n = strlen(s);
int i = 1;
for ( ; i < n; i ++ )
{
if (!check_count(s[i])) break;
a1 += s[i];
}
int res = 0;
i ++;
for( ; i < n; i ++ )
{
res = res * 10 + s[i] - '0';
} while (res)
{
char p;
int t = res % 26; //0代表他是最后一个字母
if(!t)
p = 'Z';
else
p = t - 1 + 'A';
a2 = p + a2 ;
if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0
else res = res / 26;
} cout << a2 << a1 << '\n';
} void change2()
{
int n;
n = strlen(s);
int i = 0;
string s1 = "R", s2 = "C";
for( ; i < n; i ++ )
{
if(check_count(s[i])) break;
} for( ; i < n; i ++ )
{
s1 += s[i];
} string t = "";
for(int i = 0; i < n; i ++ )
{
if (check_count(s[i])) break;
t += s[i];
} int res = 0;
for(int i = 0; i < t.size(); i ++ )
{
res = res * 26 + t[i] - 'A' + 1;
} string tt = to_string(res);
s2 += tt;
cout << s1 << s2 << '\n';
} bool check()
{
int n;
n = strlen(s);
if(s[0] == 'R')
{
int j = 1;
while(check_count(s[j]) && j < n) j ++ ;
if(j == 1) return false; if(s[j] == 'C') return true;
} return false;
} void solved()
{
cin >> s;
if(check())
{
change1();
}
else
{
change2();
}
} int main()
{
int t;
cin >> t;
while (t--)
{
solved();
} return 0;
}

1B踩坑大王的更多相关文章

  1. Faster_Rcnn在windows下运行踩坑总结

    Faster_Rcnn在windows下运行踩坑总结  20190524 今天又是元气满满的一天! 1.代码下载 2.编译 3.下载数据集 4.下载pre-train Model 5.运行train ...

  2. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  3. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  4. 【踩坑速记】二次依赖?android studio编译运行各种踩坑解决方案,杜绝弯路,总有你想要的~

    这篇博客,只是把自己在开发中经常遇到的打包编译问题以及解决方案给大家稍微分享一下,不求吸睛,但求有用. 1.大家都知道我们常常会遇到dex超出方法数的问题,所以很多人都会采用android.suppo ...

  5. NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters

    /******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...

  6. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

  7. router路由去掉#!的踩坑记

    项目中在研究去掉router#!的过程中的踩坑过程.

  8. vue+ vue-router + webpack 踩坑之旅

    说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案   老司机可以忽略下面的内容了 1)起因  考虑到数据分离的问题  因为server是express搭的   自然少 ...

  9. 记jQuery.fn.show的一次踩坑和问题排查

    最近很少已经很少用jQuery,因为主攻移动端,常用Zepto,其实很多细节和jQuery并不一样.最近又无意中接触到了PC的需求和IE6, 使用了jQuery,刚好踩坑了,特意记录一下. 本文内容如 ...

  10. WebForm路由踩坑 ajax请求多次

    WebForm路由踩坑 再次接触Asp.Net WebForm已是4年后的今天,源起新入职的公司,一个老的项目. Web接触的少,那就多动手写写. WebForm1.aspx <body> ...

随机推荐

  1. 第六十九篇:vue项目的运行过程

    好家伙, 1.vue的目录结构分析 来看看项目的目录 (粗略的大概的解释) 2.vue项目的运行流程 在工程化项目中,vue要做的事情很单纯:通过main.js把App.vue渲染到index.htm ...

  2. UE 实现镜头平移,旋转和缩放

    0x00 引 在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制. 0x01 键盘控制镜头前后左右移动 通 ...

  3. VS Code中Markdown常用插件

    目录 目录 1.Markdown All in One 2.Markdown Preview Enhanced 3.markdownlint 1.Markdown All in One 自动生成目录 ...

  4. centos7部署Prometheus+Grafana

    一.安装Prometheus Server 请从 Prometheus 官方下载 linux 版的二进制压缩包.注意在下载前要选择操作系统为 linux. 执行下面的命令把 prometheus se ...

  5. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(19)-Fiddler精选插件扩展安装,将你的Fiddler武装到牙齿

    1.简介 Fiddler本身的功能其实也已经很强大了,但是Fiddler官方还有很多其他扩展插件功能,可以更好地辅助Fiddler去帮助用户去开发.测试和管理项目上的任务.Fiddler已有的功能已经 ...

  6. Linux下自动删除过期备份和自动异地备份

    每天自动删除过期备份 首先编写一个简单的Shell脚本DeleteExpireBackup.sh: #!/bin/bash # 修改需要删除的路径 location="/database/b ...

  7. 输入法词库解析(六)QQ 拼音分类词库.qpyd

    详细代码:https://github.com/cxcn/dtool 前言 .qpyd 是 QQ 拼音输入法 6.0 以下版本所用的词库格式,可以在 http://cdict.qq.pinyin.cn ...

  8. 在客户端电脑使用 kubectl 远程管理 Kubernetes

    日常工作中,可能需要在自己的笔记本电脑上执行 kubectl 命令以管理远程 Linux 服务器上的 Kubernetes 集群.通过调用 kubernetes API 来实现对 Kubernetes ...

  9. 给nsis窗口添加立体阴影

    利用SetClassLong函数给nsis窗口添加了阴影,看起来很酷^_^ System::Call `user32::SetClassLong(i$HWNDPARENT,i${GCL_STYLE}, ...

  10. 关于aws-Lambda的cron周期性计划任务-表达式的定义方式

    关于aws-Lambda的cron周期性定时任务的定义方式,与其他系统或者语言可能略有差异 区别之一,就是Lambda是6个字段的, (分,时,日,月,周,年),多了一个年份字段,各字段之间使用空格隔 ...