CF1B Spreadsheets

题意翻译

人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:

第一列被标为A,第二列为B,以此类推,第26列为Z。接下来为由两个字母构成的列号: 第27列为AA,第28列为AB...在标为ZZ的列之后则由三个字母构成列号,如此类推。

行号为从1开始的整数。

单元格的坐标由列号和行号连接而成。比如,BC23表示位于第55列23行的单元格。

有时也会采用被称为RXCY的坐标系统,其中X与Y为整数,坐标(X,Y)直接描述了对应单元格的位置。比如,R23C55即为前面所述的单元格。

您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

输入

第一行一个整数n(1<=n<=10^5),表示将会输入的坐标的数量。

接下来n行,每行一个坐标。

注意: 每个坐标都是正确的。此外不会出现行号或列号大于10^6的单元格。

输出

n行,每行一个被转换的坐标。

输入格式:

2

R23C55

BC23

输出格式:

BC23

R23C55

分析:这道题其实挺简单的,想到就是将十进制的数转换为二十六进制就可以了,然后注意一下当n2%26==0的时候是'A'就可以了

 1 #include<iostream>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdlib>
 6 using namespace std;
 7 char a[20];
 8 
 9 void solve1(){
10     int len=strlen(a);
11     int i;
12     int n1=0,n2=0;
13     int flag=0;
14     for( i=1; i<len; i++ ){
15         if(a[i]>='0'&&a[i]<='9'&&flag==0){
16             n1=n1*10+(a[i]-'0');
17         }
18         else if(a[i]>='0'&&a[i]<='9'&&flag==1){
19             n2=n2*10+(a[i]-'0');
20         }
21         else{
22             flag=1;
23         }
24     }
25 //    cout<<"n1="<<n1<<" n2="<<n2<<endl;
26     char temp[100];
27     int pos=0;
28     while(n2!=0){
29         int t=n2%26;
30         if(t==0) temp[pos++]='A';
31         else{
32             temp[pos++]=(char)(65+t-1);
33         }
34         n2/=26;
35     }
36     for( int i=pos-1; i>=0; i-- ){
37         cout<<temp[i];
38     }
39     cout<<n1<<endl;
40 }
41 
42 void solve2(){
43 //    cout<<a<<endl;
44     int len=strlen(a);
45     int t=0;
46     for( int i=0; i<len; i++ ){
47         if(!(a[i]>='A'&&a[i]<='Z')){
48             t=i-1;
49             break;
50         }
51     }
52     double m2=0;
53     for( int i=0; i<=t; i++ ){
54         m2=m2+(a[i]-'A'+1)*(pow(26,(t-i)));
55 //        cout<<"a[i]-'A'+1="<<a[i]-'A'+1<<" "<<pow(26,(t-i))<<endl;
56 //        cout<<"m2="<<m2<<endl;
57     }
58     cout<<'R';
59     for( int i=t+1; i<len; i++ ){
60         cout<<a[i];
61     }
62     cout<<'C'<<m2<<endl;
63 }
64 
65 int main(){
66     int n;
67     cin>>n;
68     while(n--){
69         cin>>a;
70         if(a[0]=='R'&&a[1]>='0'&&a[1]<='9'){
71 //            cout<<a<<endl;
72             solve1();
73         }
74         else{
75             solve2();
76         }
77     }
78     return 0;
79 }

但是在做这道题的时候有个很气愤的事,如果你把52行的double m2=0;改成int m2=0;(笔者实在codeblocks,,,MINGW编译器下跑的程序),会发现结果是不对的,样例二得出结果是m2=51

这个去看了下pow函数的源码,。。。。问了下大佬们,pow是很玄学的东西,所以大家在写东西的时候尽量避开pow函数,自己写个for循环鸭,也不长。。。

转载于:https://www.cnblogs.com/Bravewtz/p/10348924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值