Codeforces 1B - Spreadsheet

来源:互联网 发布:金手指代码转换软件 编辑:程序博客网 时间:2024/04/23 23:25


这道题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;}


原创粉丝点击