CF1B.Spreadsheets(电子表格) 题解 模拟
- 作者:zifeiy
- 标签:模拟
题目出处:Spreadsheets
题目描述
在流行的电子表格系统中(例如,在Excel中),使用如下计算方式来对列号进行计算。
第1列对应A,第2列对应B,……,第26列对应Z。然后使用两个大写英文字母来表示列:第27列对应AA,第28列对应AB,第52列对应AZ,……,在ZZ之后,使用三个大写英文字母来表示列,如是循环……
行号由以1开头的整数进行标记。单元格的名称是列号和行号的连接。举个例子,BC23是位于第55列,第23行的单元格的名称。
有时我们使用另一种计算方式来表示单元格名称:RXCY,其中X和Y是整数,分别表示行号和列号。举个例子,R23C55 是上述的单元格名称的另一种表示。
你的任务是编写一个程序,读取给定的单元格坐标名称的计算方式,并且根据该计算方式得到另一种计算方式。
输入格式
输入的第一行包含一个整数 \(n(1 \le n \le 10^5)\) ,用于表示测试数据的组数。接下来 \(n\) 行每行包含一个字符串,用于表示一种计算方式的表述。所有描述计算方式的字符串都没有多余的空格并且它表述的单元格的实际行号和列号都不会超过 \(10^6\) 。
输出格式
输出 \(n\) 行,每行包含该单元格的计算方式对应的另一种计算方式。
样例输入
2
R23C55
BC23
样例输出
BC23
R23C55
题目分析
这道题目是一道很好的模拟题,它模拟了电子表格的列号。
我们可以将列号的字符串表示想象成一个进制数,但是在确定进制数之前,我们需要知道它占用了多少位。
首先转换成“AA..A”的形式,然后它就是一个26进制数了。(这里的解释有些简略,有时间再补充)
代码解释:
- check()函数用于确定电子表格是哪种计算方式;
- c2s()用于将列号对应的整数c转换成字符串s;
- s2c()用于将列号对应的字符串s转换成整数c。
另外,从字符串中提取出行号和列号,也是需要好好处理的细节。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
char ch[110], s[110];
int T, r, c;
bool check() {  // 如果ch为“R23C55”格式则返回true,否则返回false
    for (int i = 1; ch[i]; i ++)
        if (isdigit(ch[i-1]) && ch[i] == 'C')
            return true;
    return false;
}
void c2s() {    // 将数值c转换成字符串s
    int i, t = 1;
    for (i = 0; t <= c; i++, t *= 26) {
        s[i] = 'A';
        c -= t;
    }
    s[i] = '\0';
    for (int i = 0; c > 0; i ++) {
        s[i] += c % 26;
        c /= 26;
    }
    strrev(s);
}
void s2c() {    // 将字符串s转换成数值c
    c = 0;
    int len = strlen(s);
    int t = 1;
    for (int i = 0; i < len; i ++) {
        c += t;
        t *= 26;
    }
    t = 1;
    for (int i = len-1; i >= 0; i --) {
        c += (s[i] - 'A') * t;
        t *= 26;
    }
}
int main() {
    cin >> T;
    while (T --) {
        cin >> ch;
        if (check()) {
            sscanf(ch, "R%dC%d", &r, &c);
            //printf("r = %d , c = %d\n", r, c);
            c2s();
            printf("%s%d\n", s, r);
        }
        else {
            int i;
            for (i = 0; isupper(ch[i]); i ++);
            strncpy(s, ch, i);
            s[i] = '\0';
            sscanf(ch+i, "%d", &r);
            //printf("s = %s , r = %d\n", s, r);
            s2c();
            printf("R%dC%d\n", r, c);
        }
    }
    return 0;
}
CF1B.Spreadsheets(电子表格) 题解 模拟的更多相关文章
- Blocked Billboard II题解--模拟到崩溃的模拟
		前言 比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 题目 题目描述 奶牛Bassie想要覆盖一大块广告牌,她在之前已经覆盖了一小部分广告牌 ... 
- CF1B Spreadsheets
		题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ... 
- PAT甲级1017题解——模拟排序
		题目分析: 本题我第一次尝试去做的时候用的是优先队列,但是效率不仅代码量很大,而且还有测试样例过不去,很显然没有找到一个好的数据结构来解决这道题目(随着逐渐的刷PAT甲级的题会发现有时选择一个好的解题 ... 
- 洛谷P5020 货币系统 题解 模拟
		题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ... 
- 洛谷P5019 铺设道路 题解 模拟/贪心基础题
		题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ... 
- 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】
		好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ... 
- Codeforces Round #271 (Div. 2)题解【ABCDEF】
		Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ... 
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) A B C D 水 模拟 并查集 优先队列
		A. Broken Clock time limit per test 1 second memory limit per test 256 megabytes input standard inpu ... 
- 【bzoj1150】[CTSC2007]数据备份Backup  模拟费用流+链表+堆
		题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ... 
随机推荐
- (二)SpringBoot功能
			web开发 spring boot web开发非常的简单,其中包括常用的json输出.filters.property.log等 json 接口开发 在以前的spring 开发的时候需要我们提供jso ... 
- 三、Redis操作
			一.基本介绍 1.简介 Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dictionary Ser ... 
- Android——<uses-sdk>
			语法(SYNTAX): <uses-sdk android:minSdkVersion="integer" android:targetSdkVersion="in ... 
- php安装oci8和pdo_oci扩展实现连接oracle数据库
			PHP一般跟MySQL数据库搭配使用,但最近遇到一个需求需要实现PHP连接Oracle,了解到PHP可以通过pdo_oci和oci8扩展来连接Oracle,这里将安装的过程记录下来. 安装环境:PHP ... 
- oracle误操作commit之后,可以闪回数据
			1. 授予行迁移权限 alter table table_name enable row movement; 2. 到15分钟前: flashback table order to timesta ... 
- Leetcode695.Max Area of Island岛屿的最大面积
			给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定的二维数组中 ... 
- Android LruCache源码简介
			package android.util; import java.util.LinkedHashMap; import java.util.Map; /** * A cache that holds ... 
- Spring boot通过JPA访问MySQL数据库
			本文展示如何通过JPA访问MySQL数据库. JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据 ... 
- JavaScript--tab栏切换效果
			tab栏切换效果: <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ... 
- SQL左连接查询 left join ... on
			左连接查询 保留左边主表的所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null 示例:组合两个表 - 力扣 表1: Person +--------------+- ... 
