zoukankan      html  css  js  c++  java
  • 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] = '';
        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
    ", r, c);
                c2s();
                printf("%s%d
    ", s, r);
            }
            else {
                int i;
                for (i = 0; isupper(ch[i]); i ++);
                strncpy(s, ch, i);
                s[i] = '';
                sscanf(ch+i, "%d", &r);
                //printf("s = %s , r = %d
    ", s, r);
                s2c();
                printf("R%dC%d
    ", r, c);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 队列操作
    DUILIB创建不规则窗体,自定义控件(很不错的几十篇文章)
    修改窗口属性(全部都是SetWindowLong设置)
    搭建DirectUi开发平台
    _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题
    VLD(Visual LeakDetector)内存泄露库的使用
    设计模式之组合模式
    Moq的使用心得
    Moq 测试 属性,常用方法
    C#中Linq查询基本操作
  • 原文地址:https://www.cnblogs.com/codedecision/p/11661026.html
Copyright © 2011-2022 走看看