一个萌新的成长之路

Background

  • 同学们都回家了,只有我和wjh还有邢神在机房敲代码,吃random口味的方便面……

Description

Translated by @PC_DOS from luogu

  • In the popular spreadsheets systems (for example, in Excel) the following numeration of columns is used. The first column has number A, the second — number B, etc. till column 26 that is marked by Z. Then there are two-letter numbers: column 27 has number AA, 28 — AB, column 52 is marked by AZ. After ZZ there follow three-letter numbers, etc.
  • The rows are marked by integer numbers starting with 1. The cell name is the concatenation of the column and the row numbers. For example, BC23 is the name for the cell that is in column 55, row 23.
  • Sometimes another numeration system is used: RXCY, where X and Y are integer numbers, showing the column and the row numbers respectfully. For instance, R23C55 is the cell from the previous example.
  • Your task is to write a program that reads the given sequence of cell coordinates and produce each item written according to the rules of another numeration system.
  • 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:
  • 第一列被标为A,第二列为B,以此类推,第26列为Z。接下来为由两个字母构成的列号: 第27列为AA,第28列为AB...在标为ZZ的列之后则由三个字母构成列号,如此类推。
    行号为从1开始的整数。
  • 单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行的单元格。
    有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。
  • 您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

Input&Output

Input Format:

  • The first line of the input contains integer number n (1<=n<=10^6) , the number of coordinates in the test. Then there follow n lines, each of them contains coordinates. All the coordinates are correct, there are no cells with the column and/or the row numbers larger than 10^6.
  • 第一行一个整数n(1<=n<=10^5),表示将会输入的坐标的数量。
  • 接下来n行,每行一个坐标。
  • 注意: 每个坐标都是正确的。此外不会出现行号或列号大于10^6的单元格。

Output Format:

  • Write n lines, each line should contain a cell coordinates in the other numeration system.
  • n行,每行一个被转换的坐标。

Sample

Input:

2
R23C55
BC23

Output:

BC23
R23C55

Solution

  • 本题并不难,涉及字符串处理和一点数学.
    首先是判断输入数据属于哪一种类型,由于数据规模较小,本蒟蒻选择了暴力.
    这道题其实相当于一个进制互换,而我们发现行数R是不需要计算的,也就是需要考虑列数C的转化.
  • 不难发现对于一个字符串“C(1)C(2)C(3)……C(n)”,给定每个字符的编号为i(A=1,B=2……),她所代表的列数即为i(n)×26^0+i(n-1)×26^1+i(n-2)×26^2.
  • 数字转字符串呢?类比其他进制转换的过程,我们可以知道每次将c对26取模,结果就是对应字符串的第n,n-1,n-2……位.进行每次操作后,c减去 c%26,再用26除即可.
  • 需要注意的是,26%26=0,需要对Z进行特判,作差时也要注意减去26.
  • 代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s[1000];
    char alphabet[27] = { 'Z','A','B','C','D','E',
    'F','G','H','I','J','K',
    'L','M','N','O','P','Q',
    'R','S','T','U','V','W',
    'X','Y','\0' };
    inline bool check(char *s)//检查类型
    {
    int len=strlen(s);
    int type=0;
    for(int i=0;i<len;++i)
    {
        if(s[i]>='0'&&s[i]<='9')type=1;
        if(type&&s[i]=='C')return true;
    }
    return false;
    }
    inline void rd()
    {
    int r = 0, c = 0;
    int bit = 1;
    scanf("%s", &s);
    char output[1000];
    if (check(s))
    {
        int i = 1;
        while (s[i] >= '0'&&s[i] <= '9')
        {
            r = (r << 1) + (r << 3) + (s[i] ^ 48);//类似于读入优化,提速の小技巧
            i++;
        }
        i++;
        while (s[i] >= '0'&&s[i] <= '9')
        {
            c = (c << 1) + (c << 3) + (s[i] ^ 48);
            i++;
        }
        while (c != 0)//特判
        {
            int t=c%26;
            output[bit++] = alphabet[t];
            c -= t?t:26;
            c /= 26;
        }
        for (int j = bit-1;j >=1;--j)printf("%c", output[j]);
        printf("%d\n", r);
        return;
    }
    else {
        int i = 0;
        r=0;
        c=0;
        while (s[i] >= 'A'&&s[i] <= 'Z')
        {
            c = (c << 1) + (c << 3) + (c << 4) + s[i] + 1 - 'A';
            i++;
        }
        while (s[i] >= '0'&&s[i] <= '9')
        {
            r = (r << 1) + (r << 3) + (s[i] ^ 48);
            i++;
        }
        printf("R%dC%d\n", r, c);
        return;
    }
    }
    int main()
    {
    int n;
    scanf("%d", &n);
    for (int i = 1;i <= n;++i)rd();
    return 0;
    }
  • Feb,06,2018 Tue

CodeForces 1B-字符串,进制转换与数学的更多相关文章

  1. SHUoj 字符串进制转换

    字符串进制转换 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:17   时间限制: 1000ms   内存限制: 128M 描述 Claire Redfield ...

  2. SHU 414 - 字符串进制转换

    题目链接:http://acmoj.shu.edu.cn/problem/414/ 很咸鱼的网上拉了个进制转换模板过来,因为数组开的太小一直WA,后来一气之下MAXN开到1e5,真是蓝瘦…… 后来实在 ...

  3. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】

    任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB “他觉得一个人奋斗更轻松自在 ...

  4. B. Spreadsheets(进制转换,数学)

    B. Spreadsheets time limit per test 10 seconds memory limit per test 64 megabytes input standard inp ...

  5. C语言拼接字符串以及进制转换

    #include<stdio.h> #include<stdlib.h> #include<string.h> char *join1(char *, char*) ...

  6. 总结day3 ---- 进制转换,字符串切片,字符串常用方法.,for 循环,

    前情提要: int 的相关操作 进制转换 bit_lenth() str 的索引,以及常用的相关方法 for 循环 索引 切片 相关方法 一  : int 的相关操作 int 主要用于生活中的计算问题 ...

  7. 19-3-4 Python进制转换;bool str int三者之间的转换;字符串的索引,切片;for循环的使用

    进制转换: 二进制转十进制:  0010 1111 = 1*2**0+1*2**1+1*2**2+1*2**3+1*2**5 十进制转换二进制: 用十进制数除2逆序取余 --->101010 布 ...

  8. 暴力/进制转换 Codeforces Round #308 (Div. 2) C. Vanya and Scales

    题目传送门 /* 题意:问是否能用质量为w^0,w^1,...,w^100的砝码各1个称出重量m,砝码放左边或在右边 暴力/进制转换:假设可以称出,用w进制表示,每一位是0,1,w-1.w-1表示砝码 ...

  9. C# 进制转换 在什么情况下使用16进制,字节数组,字符串

    C# 进制转换 Admin2013年9月18日 名人名言:从工作里爱了生命,就是通彻了生命最深的秘密.——纪伯伦 1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制Con ...

随机推荐

  1. 元素化设计原理及规则v1.0

    一.元素设计架构 元素设计架构展示在基于元素化设计的思想下,系统各元素之间如何相互协作,并完成整个系统搭建. 架构中以Entity(数据)为中心,由Entity产生数据库表结构,并且Entity作为业 ...

  2. CentOS7安装最新版git教程

    下载编译工具 yum -y groupinstall "Development Tools" 下载依赖包 yum -y install zlib-devel perl-ExtUti ...

  3. HyperLedger Fabric 1.1 手动部署单机单节点

    手动部署单机单节点 之前发布过官方的e2e部署方案,由于环境或是访问权限等各种问题,还是有相当一部分码友无法成功跑起来,故此,本章将来一次纯手动操作的集群部署. 主要需要的步骤如下: 1:环境整理 2 ...

  4. 文本编辑工具vim

    前面多次提到过vim这个东西,它是linux中必不可少的一个工具.没有它很多工作都无法完成.早期的Unix都是使用的vi作为系统默认的编辑器的.你也许会有疑问,vi与vim有什么区别?可以这样简单理解 ...

  5. IntelliJ Idea常用的快捷键

    以下是IntelliJ Idea2017版的,基本上不会有什么变化 IntelliJ Idea这个编译器现在非常流行,他强大的快捷键非常好用,相比于eclipse,IntelliJ Idea界面也比e ...

  6. Java对象流的使用

    为了让对象持久化(把对象存储到本地),可以使用java的对象流处理对象,把对象的内容写到本地存储的文件中,也可以从本地文件中读取出来.也就是常说的序列化和反序列化 主要用到了ObjectInputSt ...

  7. shell 文本操作命令

    vi 编辑器中有三种状态模式  [vi 文件名(或路径+文件名)] 1.命令模式 2.输入模式 3.末行模式 三种模式间的相互转换 vi编辑器的启动与退出 直接进入编辑环境 $ vi 进入编辑环境并打 ...

  8. 笔记:MyBatis Mapper XML文件详解 - Cache

    缓存(Cache) 从数据库中加载的数据缓存到内存中,是很多应用程序为了提高性能而采取的一贯做法.MyBatis对通过映射的SELECT语句加载的查询结果提供了内建的缓存支持.默认情况下,启用一级缓存 ...

  9. GPS服务端(上)-Socket服务端(golang)

    从第一次写GPS的服务端到现在,已经过去了八年时光.一直是用.net修修改改,从自己写的socket服务,到suppersocket,都是勉强在坚持着,没有真正的稳定过. 最近一段时间,服务端又出了两 ...

  10. MYSQL数据库学习十二 使用MySQL运算符

    12.1 算术运算符 + - * /(DIV) %(MOD) 12.2 比较运算符 > < = <=> != <> >= <= BETWEEN AND ...