Codeforces 1B - Spreadsheet


这道题AC的不容易啊,唉,小错误频出,查看测试数据好多才改过来的。

首先注意的是两种类型属于哪一种的判断,利用第一个字符R和第二个字符是数字,还有后面存在字符C,这三个条件来判断。

然后注意的就是把就散出来的列号c值转化成AA等字母类型的时候,我找到一个规律,可以利用取余和除法来进行,

比如704代表AAB,以下为转换过程:

704%26=2-->B;

704/26=27;

27%26=1->A;

27/26=1;

1%26=1->A;

1/26=0;

此时c=0,结束循环

然后利用栈,倒着来输出。


注意到如果涉及到Z,就有点不同了。

如果余0,代表Z,然后令c--才是正确结果,

比如702代表ZZ,转换过程如下:

702%26=0-->Z;

704/26=27;

27--;

26%26=0->Z;

26/26=1;

1--;

此时c=0,结束循环




#include <iostream>
#include <string>
#include <cstring>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
bool kind_RxCx(char*ch,int len){
	if(ch[0]=='R'&&ch[1]>='0'&&ch[1]<='9')
		for(int i=0;i<len;i++)
			if(ch[i]=='C') return 1;
	return 0;
}
int main()
{
    int n;
    cin>>n;
    getchar();
    char ch[20];
    while(n--){
        gets(ch);
        int len=strlen(ch);
        int r=0,c=0;
        if(kind_RxCx(ch,len)){
            //from R23C55 to BC23
            char row[10],col[10];
            memset(row,0,sizeof(row));
            memset(col,0,sizeof(col));
            int row_num=0,col_num=0;
            int i; 
            //把row的值复制到row数组 
            for(i=1;i<len;i++){
                if(ch[i]>='0'&&ch[i]<='9'){
                    row[row_num]=ch[i];
                    row_num++;
                }
                else break;             
            }
            //把col的值复制到col数组 
            for(;i<len;i++){
                if(ch[i]>='0'&&ch[i]<='9'){
                    col[col_num]=ch[i];
                    col_num++;
                }
            }
            r=atoi(row);
            c=atoi(col);
            //把c的字母表示计算出来
            stack<char> sc;
            while(c){
                char temp=c%26+'A'-1;
                if(temp=='A'-1)//即 c%26=0 
                    temp='Z';
                sc.push(temp);
                c/=26;
                if(temp=='Z') c--;
            }
            while(!sc.empty()){
                cout<<sc.top();
                sc.pop();
            }
            cout<<r<<endl;
        }
        else{
            //from  BC23 to R23C55 
            char row[10];
            memset(row,0,sizeof(row));
            int row_num=0;
            int j; 
            //把row的值复制到row数组 
            for(j=0;j<len;j++){
                if(ch[j]>='0'&&ch[j]<='9'){
                    row[row_num]=ch[j];
                    row_num++;      
                }                   
            }
            //把col的值计算出来 
            int flag=0;//位数 
            for(j=len-1;j>=0;j--){          
                if(ch[j]>='A'&&ch[j]<='Z'){
                    int add=ch[j]-'A'+1;
                    for(int k=0;k<flag;k++)
                        add*=26;
                    flag++;
                    c+=add;
                    }
            }
            r=atoi(row);
            
            cout<<"R"<<r<<"C"<<c<<endl;
        }
    } 
    return 0;
}


你可能感兴趣的:(c,测试,spreadsheet)