码迷,mamicode.com
首页 > 其他好文 > 详细

CF1B Spreadsheets

时间:2019-02-02 19:19:13      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:pre   翻译   lag   ++   直接   --   cstring   单元格   格式   

题意翻译

人们常用的电子表格软件(比如: 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循环鸭,也不长。。。

CF1B Spreadsheets

标签:pre   翻译   lag   ++   直接   --   cstring   单元格   格式   

原文地址:https://www.cnblogs.com/Bravewtz/p/10348924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!