CODEFORCES 1B Spreadsheets
Posted reactord
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",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); 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 ",pstr+1,row); 53 } 54 else calc(); 55 } 56 else calc(); 57 } 58 return 0; 59 }
以上是关于CODEFORCES 1B Spreadsheets的主要内容,如果未能解决你的问题,请参考以下文章