您的位置:首页 > 其它

问题 A: 序号互换 河南省第四届ACM程序设计大赛

2016-05-30 17:45 204 查看

问题 A: 序号互换

时间限制: 1 Sec  内存限制: 128 MB

提交: 37  解决: 27

[提交][状态]

题目描述

Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来。单元格的行坐标是由数字编号的数字序号,而列坐标使用字母序号。观察字母序号,发现第1列到第26列的字母序号分别为A,B,…,Z,接着,第27列序号为AA,第28列为AB,依此类推。

若给Dr.Kong的机器人卡多一个数字序号(比如32),它能很快算出等价的字母序号(即AF),若给机器人一个字母序号(比如AA)),它也能很快算出等价的数字序号(27),你能不能与卡多比试比试,看谁能算得更快更准确。 

输入

第一行: N        表示有多少组测试数据。

接下来有N行,    每行或者是一个正整数,或者是一个仅由大写字母组成的字符串。

输入保证,所有数字序号和字母序号对应的数字序号均 ≤ 2*10^9

输出

对于每一行测试数据,输出一行。如果输入为一个正整数序号,则输出等价的字母序号;如果输入为字符串,则输出等价的数字序号。

样例输入

327GAA

样例输出

AA727

提示

[提交][状态]

这里的 转换与十进制数的进制转换有一定的区别:

#include <iostream>

#include <stdio.h>

#include <string.h>

#include <algorithm>

#include <math.h>

using namespace std;

typedef long long ll;

#define INF 0x3f3f3f3f

int main()

{

    int N,i;

    char str[25],s[110];

    while(scanf("%d",&N)!=EOF)

    {

        while(N--)

        {

            scanf("%s",str);

            if(str[0]>='0' && str[0]<='9')

            {

                ll num1=0;

                for(i=0;str[i];i++)

                {

                    num1=num1*10+str[i]-'0';

                }

                int j=0;

                while(num1>0)

                {

                    s[j++]=(num1-1)%26+'A';    ///由于取余可能为0;而十进制数刚好从0开始的,这里我们加的是“A”,所以要先减去1;再取余~

                    if(num1%26==0)

                        num1=num1/26-1;  

                    else

                        num1=num1/26;

                }

                for(i=j-1;i>=0;i--)

                    printf("%c",s[i]);

                printf("\n");

            }

            else

            {

                ll num2=0;

                for(i=0;str[i];i++)

                {

                    num2=num2*26+(str[i]-'A'+1);

                }

                printf("%lld\n",num2);

            }

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: