Barty 的表格

( 程序文件名: excel. pas/c/cpp) 
【问题描述】
Excel 中的列号是使用大写字母标识的,第一列是 A,第二列是 B,然后依 次标下去,第 26 列是 Z。之后列号变为两位从 AA~ZZ 以字典顺序标识 (AA,AB,AC...AZ,BA,BB,BC....ZZ) 。 再 之 后 列 号 变 为 三 位 大 写 字 母 AAA---ZZZ(AAA,AAB,AAC...AAZ,ABA...ZZZ),依次类推。 Excel 中的行号是使用数字标识的,从 1 开始表示第 1 行,第 2 行,第 3 行……
一直标下去。 Barty 手中有一份非常大的表格数据,他想得知某些单元格的内容,但是他 不知道 Excel 中这些单元格的行号和列号分别是什么,于是请你编写程序来 帮帮他。
【输入文件】文件名: excel.in
第一行两个正整数,数据表格允许的最大行列数m和要查询的单元格数量n(n <= 100)。
接下来 n 行,每行一条格式为“X NUM X NUM”的查询 X 是一个大写字母‘R’或‘C’,表示行或列,NUM 为一个整数 (0<= NUM <= 10^9)。
【输出文件】文件名: excel.out
对每一条查询,所在单元格的行号和列号,用一个空格隔开
若单元格不存在,输出-1
每条查询占一行。
【样例输入】
100 3
R 23 C 26
R 94 C 27
R 59 C 102
【样例输出】
23 Z
94AA
-1

分析:

题目改编于某国外OJ中一题。当时一眼看上去就觉得很水,没仔细想就敲,结果Wrong Answer好多次。Bella把题目简化后放到这里,目的是强调一下细心。

长度为1的字符串有26个,长度为2的有26*26个……因此我们首先可以确定列号对应的字符串长度。然后就是26进制的数字转化了,组合方法也好暴力转化也好,都需要想清楚边界全A和全Z的情况。

另卡了两个小Trick,就是两个R两个C这种单元格算做不存在的,并且题目中有说行号列号都从1开始,0是不存在的。(Bella很坏吧~)

      特判之后,主要要解决的就是进制转化问题,A~Z共有26个,很容易想到这是一个26进制,但是如果直接mod26的话肯定会错的!因为题目上说数字是从1开始的,想一想平常的10进制是0~9的,类比一下26进制应该是0~25的,那么如果从数字1开始的话肯定要多算一个,所以要减去1,具体过程看代码。

代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int m,n;
void pt(int x)
{
    x=x-1;
    int t=x%26;
    x=x/26;
    if(x) pt(x);
    putchar('A'+t);
    return;
}
int main()
{
    freopen("excel.in","r",stdin);
    freopen("excel.out","w",stdout);
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)
    {
        char a[3],b[3];
        int a1,b1;
        scanf("%s%d%s%d",a,&a1,b,&b1);
        if(a[0]!='R') swap(a1,b1);
        if(a1>m||a1<1||b1>m||b1<1||a[0]==b[0]) {printf("%d\n",-1);continue;}
        printf("%d ",a1); pt(b1);
        printf("\n");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值