CodeForces 1B-字符串,进制转换与数学

一个萌新的成长之路

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

原文地址:https://www.cnblogs.com/nishikino-curtis/p/8424142.html

时间: 2024-10-10 13:32:19

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

SHUoj 字符串进制转换

字符串进制转换 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:17   时间限制: 1000ms   内存限制: 128M 描述 Claire Redfield在龙之谷游戏的一次任务中获得了一个上了锁的宝箱,上面刻了一串由小写字母构成的字符串A和一个数字m  . 经过Claire长时间研究,他发现密码是和a  ,m  有关的.字符串A相当于一个26进制的数字,a  相当于0  ,b  相当于1  --.z  相当于25  .然后要将这个26进制的数转化成m

SHU 414 - 字符串进制转换

题目链接:http://acmoj.shu.edu.cn/problem/414/ 网上拉了个进制转换模板过来,因为数组开的太小一直WA,难受-- 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 10000 4 int t[MAXN],A[MAXN],n; 5 char OldData[MAXN],NewData[MAXN]; //转换前.后的数据 6 int olds,news; //转换前.后的进制 7 void tr

HDU 4937 Lucky Number (数学,进制转换)

题目 参考自博客:http://blog.csdn.net/a601025382s/article/details/38517783 //string &replace(iterator first0, iterator last0,const_iterator first, const_iterator last); //把[first0,last0)之间的部分替换成[first,last)之间的字符串 /* 题意: 我们将3,4,5,6认为是幸运数字.给定一个十进制数n. 现在可以讲起任意转

数学运算高级工具bc:小数精度;进制转换;计算平方及平方根

bc是一个用于数学运算的高级工具,包含了大量选项,可以借助它执行浮点数运算并应用一些高级函数: [[email protected] ~]# echo 3*2.12 | bc 6.36 [[email protected] ~]# n=54 [[email protected] ~]# m=`echo "$n*1.5" | bc` [[email protected] ~]# echo $m 81.0 [[email protected] ~]# 其他二代参数可以放在要执行的具体操作前

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

题目传送门 1 /* 2 题意:问是否能用质量为w^0,w^1,...,w^100的砝码各1个称出重量m,砝码放左边或在右边 3 暴力/进制转换:假设可以称出,用w进制表示,每一位是0,1,w-1.w-1表示砝码与物品放在一起,模拟判断每位是否ok 4 详细解释:http://blog.csdn.net/u011265346/article/details/46556361 5 总结:比赛时压根没往进制去想,连样例也不知道是怎么回事..中文不行啊:( 6 */ 7 #include <cstdi

(数字类型,进制转换,字符串,列表)介绍和操作

数字类型 整型 用途:记录年龄.等级.号码等 定义方式如 age = 18 本质 # age = int(18) 整型只能存一个值而且是不可变类型 int()方法能将字符串转为整型 需要注意的是使用int只能转纯数字的字符串,有小数点也不行 浮点型 用途:记录身高.体重.薪资等 定义方式如 height= 185.1 本质 # height= float(185.1) 浮点型只能存一个值而且是不可变类型 float()方法能将字符串和整型转为浮点型 需要注意的是使用float方法只能转纯数字的字

c语言将字符串转成int,将int转成字符串。附带任意进制转换函数

在网上看到各种将字符串转成int,和int转成字符串的方法.我自己比较喜欢用的方法是下面的,记住模板就行,最开始我也老是记不住,找到规律,多用几遍就好了. 1.将字符串转成int char s[20] = "123456";   // 注如果此处不是数字字符串类型,如下面的字符串  12abc -->  12        ab12 --> 0 int a = 0; sscanf(s,"%d",&a);   // a = 123456   就得到

数学问题-进制转换

模板: struct nlist{ vector<int> v; int r; nlist(){} nlist(string s,int r):r(r){ for(int i=0;i<s.size();i++){ v.push_back(s[i]-48); } } print(){ for(int i=0;i<v.size();i++){ printf("%d ",v[i]); } puts(""); } }; void converse(c

HDU4814——数学,模拟进制转换

本题围绕:数学公式模拟进制转换 HDU4814 Golden Radio Base 题目描述 将一个十进制的非负整数转换成E(黄金分割数)进制的数 输入 不大于10^9的非负整数,处理到文件尾 输出 转换成的E进制数(可能含有小数) 样例输入 1 2 3 6 10 样例输出 1 10.01 100.01 1010.0001 10100.0101 题目分析 对于本题,要注意的点有:首先对于一个十进制的正数,我们是可以严格转换成一个E(黄金分割数)进制的数的,而不是涉及到约等于,例如10-base的