zoukankan      html  css  js  c++  java
  • B

    在一些知名的表格处理系统中(比如:excel表格),我们经常用大写的字母来表示列,例如A表示第1列,B表示第2列,第26列用Z来表示,同时第27列我们用AA来表示,第28列我们用AB来表示,第29列我们用AC来表示,AZ表示第52列,ZZ之后我们就需要用3个字母来表示列了。
      行的表示比较简单,我们一般用正整数来表示,比如1就表示第1行,5就表示第5行,行和列一起表示成为类似BC23的情况,这个表示在第23行,第55列。
      有时候,我们的系统也会用RXCY的格式来表示,X和Y是整数,分别表示行号和列号。例如:R23C55表示的位置和之前那个例子是一样的。
      你的任务是写一个程序,将这些位置在两种不同的表示方法之间转化。

    Input

    第一行是一个正整数n(1<=n<=10^5), 表示测试数据的数量。
    接下来n行,每行一串字符,表示一个位置,输入保证所有的位置都是正确的,没有一个位置的行号或者列号超过10^ 6。

    Output

    输出n行,每行是对应的位置的转化结果。

    Sample Input

    2
    R23C55
    BC23

    Sample Output

    BC23
    R23C55
     
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<stack>
    #include<cstdlib>
    #include<queue>
    #include<set>
    #include<string.h>
    #include<vector>
    #include<deque>
    #include<map>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define eps 1e-10
    #define bug printf("*********
    ")
    #define debug(x) cout<<#x"=["<<x<<"]" <<endl
    typedef long long LL;
    typedef long long ll;
    const int MAXN = 1e6 + 5;
    const int mod = 998244353;
    
    bool is(char a) {
        if('A' <= a && a <= 'Z')
            return true;
        return false;
    }
    int check(char *s)
    {
        int len = strlen(s);
        int ans = 0,pos1 = -1,pos2 = -1;
        for(int i = 0 ;i < len; i++)
        {
            if(is(s[i]) && s[i] != 'R' && s[i] != 'C')
            {
                ans++;
                continue;
            }
            if(s[i] == 'R') {
                ans ++;
                pos1 = i;
            }
            if(s[i] == 'C') {
                ans++;
                pos2 = i;
            }
        }
    
        if(ans == 2 && pos1 != -1 && pos2 != -1 && pos2 - pos1 > 1)
            return 1;
        return 2;
    }
    //将一个数转换为A - Z的进制,比如3 -> C  34 -> AH  123 -> DS
    void K(int n)
    {
        if(n>26)
            K((n-1)/26);
    
        printf("%c",(n-1)%26+'A');
    }
    int main()
    {
        int n;
        cin >> n;
        while(n--)
        {
            char s[MAXN];
            scanf("%s",s);
            int flag = check(s);
            //debug(flag);
            if(flag == 1) {
                int len = strlen(s);
                int pos1 = -1,pos2 = -1;
                for(int i = 0 ;i < len; i++)
                {
                    if(s[i] == 'R') {
                        pos1 = i;
                    }
                    if(s[i] == 'C') {
                        pos2 = i;
                    }
                }
                int p1 = 0,p2 = 0;
                for(int i = pos1 + 1; i < pos2; i++) {
                    p1 *= 10;
                    p1 += (s[i] - '0');
                }
                for(int i = pos2 + 1; i < len; i++) {
                    p2 *= 10;
                    p2 += (s[i] - '0');
                }
                char ch = 'A';
                K(p2);
                printf("%d
    ",p1);
            } else {
                int p1 = 0,p2 = 0;
                int len = strlen(s);
                int i;
                for(i = 0; i < len; i++) {
                    if(is(s[i])) {
                        p1 *= 26;
                        p1 += s[i] - 'A' + 1;
                    }
                    else
                        break;
                }
    
                for(i ; i < len ; i++) {
                    p2 *= 10;
                    p2 += s[i] - '0';
                }
                printf("R%dC%d
    ",p2,p1);
            }
        }
    }
  • 相关阅读:
    Shell编程—用户输入
    Shell编程—结构化命令
    Shell编程—基础脚本
    跳表
    分布式项目——电商秒杀
    Dubbo详解
    Kafka工作流程
    Kafka内部实现原理
    Zk实现分布式锁
    Leetcode::Pathsum & Pathsum II
  • 原文地址:https://www.cnblogs.com/smallhester/p/11360907.html
Copyright © 2011-2022 走看看