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

Spreadsheets codeforces1B(模拟+进制转换)

时间:2016-08-16 21:46:31      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

http://codeforces.com/problemset/problem/1/B

 

题意:转换两种行和列的表示方法。

 

分析:(弱弱的说下一开始自己并不会写,只是想到AA=26*1+1,就想着用除法和余数来解决了,后来发现这么模拟下去,数据好大啊,心好累。。然后就没有然后了)。后来问的别人,告诉我用26进制转换(我去,我为啥想不到,啥都别说了,看代码)

 

 

技术分享
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <queue>
#include <stack>
#include <math.h>

using namespace std;

#define INF 0x3f3f3f3f
const int maxn = 1000005;
typedef long long LL;
char str[maxn];
int flag;

void change(int n)///26进制转换
{
    if(n>26) change((n-1)/26);

    printf("%c",(n-1)%26+A);
}


void solve1()
{
    int row=0;
    int col=0;
    for(int i=1; i<flag; i++)
    {
        if(isdigit(str[i]))///计算行
            row=row*10+str[i]-0;
    }

    for(int i=flag+1; str[i]; i++)
    {
        if(isdigit(str[i]))///计算列
          col=col*10+str[i]-0;
    }

    change(col);///转换列

    printf("%d\n", row);
}

void solve2()
{
    int row = 0;
    int col = 0;

    for(int i=0; str[i]; i++)
    {
        if(isupper(str[i]))
            col=col*26+str[i]-A+1;///计算列
        else
            row=row*10+str[i]-0;///计算行
    }

    printf("R%dC%d\n", row, col);
}

int main()
{
    int T;

    scanf("%d", &T);

    while(T --)
    {
        scanf("%s", str);
        flag = 0;

        if((str[0]==R) && isdigit(str[1]))
        {
            for(int i=2; str[i]; i++)
            {
                if(str[i]==C)
                {
                    flag=i;
                    break;
                }
            }
        }

        if(flag) solve1();///判断‘R23C55’这一种情况
        else solve2();///判断‘BC23’这一种情况

    }
    return 0;
}
View Code

 

Spreadsheets codeforces1B(模拟+进制转换)

标签:

原文地址:http://www.cnblogs.com/daydayupacm/p/5777682.html

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