CodeForces 1B

Description

  在一些知名的表格处理系统中(比如: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
模拟题。
把所有情况都考虑到就好。
注意可能出现
 AAA12转化为R12C703
R12C703转化为 AAA12一类的。
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
#define N 10500
void K(int n)
{
    if(n>26)
        K((n-1)/26);

    printf("%c",(n-1)%26+'A');
}//利用递归
typedef long long LL;
int main()
{
    int t;
    char s[N];
    char str[N];
    int a[N];
    scanf("%d", &t);
    while(t--)
    {
        memset(str,0,sizeof(str));
        memset(s,0,sizeof(s));
        memset(a,0,sizeof(a));

        scanf("%s",str);
        int len = strlen(str);
        int j = 0;
        int k = 0;

        int f = 0;
        for(int i=0; i<len; i++)
        {
            if(str[i]>='0'&&str[i]<='9')
            {
                a[j] = a[j] * 10 + str[i] -'0';
                f = 1;
            }

            else if(str[i]>='A'&&str[i]<='Z')
            {
                s[k++] = str[i];
                if(f==1)
                    j++;
            }
        }
        int d = k;
///s储存了所有的字母;a储存了所有的数字。

        if(j==1&&d==2)
        {
            K(a[1]);
            printf("%d
",a[0]);

        }//转化为AAA12类的

        else
        {
            k = s[0] - 'A' + 1;
            for(int i=1; i<d; i++)
                k = k * 26 + s[i] - 'A' + 1;
            printf("R%dC%d
",a[0],k);
        }///转化为R12C703类的

    }
    return 0;
}
原文地址:https://www.cnblogs.com/biu-biu-biu-/p/5777208.html