CODEFORCES 1B Spreadsheets

一,题目大意:一个坐标有两种表示方法,一种是RXCy,表示第几行,第几列。另一种是字母加数字,例如BC34(表示55列34行,A表第1列,Z表第26列,AA表第27列)

       现给出n(1 ≤ n ≤ 10^5)个坐标的一种表示方法,求出它的另一种表示方法。

       PS:横/纵坐标的数字不超过10^6。

二,题目分析:当给出RxCy时,

       行数直接转就行了,难点在列数上。

       1.先将字符串转化成数字。

       2.再进制转换(但要注意26进制却没有0,这就需要额外特判(这想了我好久))

        {

          (1)进制转换用短除法。

          (2)需要判断几位数。

          (3)如果%的时候余0,须从下一次%出来的数上借一位。

        }

三,

 1 #include <stdio.h>
 2 #include <string.h>
 3 int col,row;
 4 int sum[10];
 5 char str[15];
 6 int pd(int x)
 7 {
 8     int i=1;
 9     while(x>sum[i])i++;
10     return i;
11 }
12 void calc()
13 {
14     int i=1;
15     col=row=0;
16     while(str[i]>='A'&&str[i]<='Z')col=(col<<4)+(col<<3)+(col<<1)+str[i++]-64;
17     while(str[i]>='0'&&str[i]<='9')row=(row<<3)+(row<<1)+str[i++]-'0';
18     printf("R%dC%d\n",row,col);
19 }
20 int main()
21 {
22     int n,len,i,j,k;
23     sum[1]=26;
24     for(i=2;i<=5;i++)sum[i]=(sum[i-1]+1)*26;
25     char pstr[15];
26     scanf("%d\n",&n);
27     while(n--)
28     {
29         memset(str,0,sizeof(str));
30         memset(pstr,0,sizeof(pstr));
31         scanf("%s",str+1);
32         if(str[1]=='R')
33         {
34             j=2;row=0;
35             while(str[j]>='0'&&str[j]<='9')
36             {
37                 row=(row<<1)+(row<<3)+str[j]-'0';
38                 j++;
39             }
40             if(str[j]=='C'&&(j++)>2)
41             {
42                 col=0;
43                 while(str[j]>='0'&&str[j]<='9')col=(col<<1)+(col<<3)+str[j++]-'0';
44                 len=pd(col);
45                 while(len)
46                 {
47                     k=col%26;
48                     col/=26;
49                     if(k==0)col-=1,k+=26;
50                     pstr[len--]=k+64;
51                 }
52                 printf("%s%d\n",pstr+1,row);
53             }
54             else calc();
55         }
56         else calc();
57     }
58     return 0;
59 }
View Code

 

posted @ 2018-11-10 23:16  abcdefa  阅读(312)  评论(0)    收藏  举报