CodeForces 1B Spreadsheets

题目链接: http://codeforces.com/problemset/problem/1/B



题意给出两种行列位置的表示方法,一个是Excel表示法,一个是(R,C)坐标表示。
   给出一种表示,输出另外一种表示。


题解进制转换的变形

  1. 从Excel转换为(R,C),类似如26进制转换为10进制
  2. 从(R,C)转换为Excel,类似如10进制转换为26进制


#include<cstdio>
#include<cstring>
char s[110000];
char word[30];
void slove1()
{

    int len = strlen(s);
    int num1 = 0 ,num2 = 0;

    int i = 1;
    while(s[i] >= '0' && s[i] <= '9')
    {
        num2 = num2*10 + s[i] - '0';
        i++;
    }

    for(i++;i < len; i++)
        num1 = num1*10+ s[i]-'0';

    int temp[10000], cnt = 0;;
    while(num1)
    {
        if(num1 % 26 == 0) {temp[cnt++] = 26; num1 = num1 / 26 - 1;}
        else{
            temp[cnt++] = num1 % 26;
            num1 = num1 / 26;
        }

    }
    for(int i = cnt-1; i >= 0; i--)
        printf("%c", word[temp[i]]);

    printf("%d\n", num2);

}

void slove2()
{
    int len = strlen(s);
    int num1 = 0, num2 = 0;

    int i = 0;
    while(s[i] >= 'A' && s[i] <= 'Z')
    {
        num1 = num1 * 26 + s[i] - 'A'+1;
        i++;
    }
    for(;i< len; i++)
    {
        num2 = num2 * 10 + s[i] - '0';
    }
    printf("R%dC%d\n", num2, num1);
}
int main ()
{
    word[1] = 'A';
    for(int i = 2; i <= 26; i++)
        word[i] = word[i-1]+1;

    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%s", s);
        int len = strlen(s);

        int flag = 0;
        for(int i = 0; i < len; i++)
        {
            if(s[i] >= '0' && s[i] <= '9' && s[i+1]>='A' && s[i+1] <= 'Z')
                flag = 1;
        }

       if(flag == 1){
            slove1();
       }
       else{
            slove2();
       }

    }
    return 0;
}



你可能感兴趣的:(codeforces)