专栏首页大白技术控的技术自留地前端试题中的编程题2:Excel地址的相互转换 [2015南桥杯试题]

前端试题中的编程题2:Excel地址的相互转换 [2015南桥杯试题]

前端试题中的编程题2:Excel地址的相互转换 

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。  事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。 要求:编写程序,对换两种不同的表示方法表示行列,即 如果输入是常规地址格式,请输出RC地址格式;如果输入是RC地址格式,请输出常规地址格式。 【输入、输出格式要求】 

样例 输入:

2 R12C4 BC23

输出: D12 R23C55

原始来源: http://codeforces.com/problemset/problem/1/B (Codeforces Beta Round #1)

B. Spreadsheets

time limit per test

10 seconds

memory limit per test

64 megabytes

input

standard input

output

standard output

In the popular spreadsheets systems (for example, in Excel) the following numeration of columns is used. The first column has number A, the second — number B, etc. till column 26 that is marked by Z. Then there are two-letter numbers: column 27 has number AA, 28 — AB, column 52 is marked by AZ. After ZZ there follow three-letter numbers, etc.

The rows are marked by integer numbers starting with 1. The cell name is the concatenation of the column and the row numbers. For example, BC23 is the name for the cell that is in column 55, row 23.

Sometimes another numeration system is used: RXCY, where X and Y are integer numbers, showing the column and the row numbers respectfully. For instance, R23C55 is the cell from the previous example.

Your task is to write a program that reads the given sequence of cell coordinates and produce each item written according to the rules of another numeration system.

Input

The first line of the input contains integer number n (1 ≤ n ≤ 105), the number of coordinates in the test. Then there follow nlines, each of them contains coordinates. All the coordinates are correct, there are no cells with the column and/or the row numbers larger than 106 .

Output

Write n lines, each line should contain a cell coordinates in the other numeration system.

Examples

input

2
R23C55
BC23

output

BC23
R23C55

类似的中文题 蓝桥杯 Excel地址转换

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”。  事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。 第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。 你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。 【输入、输出格式要求】  用户先输入一个整数n(n<100),表示接下来有n行输入数据。 接着输入的n行数据是RC格式的Excel单元格地址表示法。 程序则输出n行数据,每行是转换后的常规地址表示法。例如: 用户输入:  2  R12C4 R5C255 则程序应该输出:D12 IU5

AC代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int pow(int x,int y){
    int result = 1;
    for(int i=0;i<y;i++){
        result*=x;
    }
    return result;
}
bool kind_RxCx(char*ch,int len){                                   //判断地址是否是RC地址类型
    if(ch[0]=='R'&&ch[1]>='0'&&ch[1]<='9')                         //利用第一个字符是R和第二个字符是数字,还有后面的字符存在C的情况
        for(int i=0;i<len;i++)
            if(ch[i]=='C') return 1;
    return 0;
}


int main(){
    int n;
    char str[100];
    char number1[64];                                              //用于RC地址记录第几行
    char number2[64];                                              //用于RC地址记录第几列
    char number3[64];                                              //用于常规地址记录前面字母
    char number4[64];                                              //用于常规地址记录第几行
    cin>>n;
    while(n--){
        memset(str,0,sizeof(str));
        memset(number1,0,sizeof(number1));
        memset(number2,0,sizeof(number2));
        memset(number3,0,sizeof(number3));
        memset(number4,0,sizeof(number4));
        int i=0;
        cin>>str;
        if(kind_RxCx(str,strlen(str))){                            //如果判定为RC地址则执行从RC地址到常规地址的转换
            for(i=1;i<strlen(str);i++){
                if(str[i]>='0'&&str[i]<='9'){
                    number1[i-1]=str[i];
                }else{
                    break;
                }
            }
            int PreNumber = atoi(number1);                         //PreNumber表示RC地址的第几行.
            for(int j=0;i<strlen(str);i++){
                if(str[i]>='0'&&str[i]<='9'){
                    number2[j++]=str[i];
                }
            }
            int suffixNumber = atoi(number2);                      //suffixNumber表示RC地址的第几列.

            int remainder[100],count= 0;                           //count记录suffix整除26的次数,remainder记录每次除完之后余数
            memset(remainder,0,sizeof(remainder));

            do{                                                    //do-while循环,至少执行一回,当输入的单元格数是超过26列的情况
                if(suffixNumber%26==0){                            //如果遇到余数为0的情况
                    remainder[count++]=26;                         //说名当前常规地址满足了26个,即Z
                    suffixNumber = (suffixNumber-1)/26;            //整除之后的数必须留一位给当前,suffixNumber必须减一
                }else{
                    remainder[count++]=suffixNumber%26;            //如果余数不为0,则保存下来,因为每一位的余数为常规地址的字母
                    suffixNumber = suffixNumber/26;                //取整,求进位
                }
            }while(suffixNumber>26);                               //只要RC地址的第几列大于26,表示还可以进位

            for(char k='A';k<='Z';k++){
                if(k-'A'==(suffixNumber-1)){
                    cout<<k;
                    break;
                }
            }

            for(int j=count-1;j>=0;j--){
                for(char k='A';k<='Z';k++){
                    if(k-'A'==(remainder[j]-1)){                   //因为在26列单元格以内,所以可以直接将数字替换成英文字母
                        cout<<k;
                        break;
                    }
                }
            }
            cout<<PreNumber<<endl;                                 //输出第几行
        }else{                                                     //否则执行从常规地址到RC地址的转换
            int j=0,k=0;                                           //j常规地址字母的个数,k记录常规地址数字的个数
            for(i=0;i<strlen(str);i++){
                if(str[i]>='A'&&str[i]<='Z'){
                    number3[j++]=str[i];
                }
                else{
                    number4[k++]=str[i];
                }
            }
            int GerneralRow=0;                                    //记录常规格式第几列,即开头的字母,k计数器
            k=0;
            for(i=j-1;i>=0;i--){                                  //从开头的字母往前循环转换为数字
                GerneralRow += (number3[i]-'A'+1)*pow(26,k++);
            }
            cout<<"R"<<number4<<"C"<<GerneralRow<<endl;
        }
    }
    return 0;
}

PHP代码:

<?php
fscanf(STDIN,"%d",$n);
function IsInt($var)
{
  if(ord($var)>=48&&ord($var)<=57)
    return true;
  else
    return false;
}
function IsType1($var)
{
  $res=false;;
  for($i=1;$i<strlen($var);$i++)
  {
    if('C'==($var[$i]))
    {
      $res=true;
      break;
    }
  }
  return $res;
}
function GetInt($var)
{
  $res="";
  for($i=1;$i<strlen($var);$i++)
  {
    if(IsInt($var[$i]))
    {
      $res.=$var[$i];
    }
    else {
      return $res;
    }
  }
}
function GetInt_D($var)
{
  $res="";
  for($i=strlen($var)-1;$i>=0;$i--)
  {
    if(IsInt($var[$i]))
    {
      $res.=$var[$i];
    }
    else {
      return strrev($res);
    }
  }
}


function conversion_int($var)
{
  $res="";
  while($var>26)
  {
    if($var%26!=0)
    {
    $res.=chr(64+$var%26);
    $var=($var-$var%26)/26;
    }
    else {
      $res.='Z';
      $var=($var)/26-1;
    }
  }
  if($var!=0)
  $res.=chr(64+$var);
  return strrev($res);
}
function conversion_str($var)
{
  $res=0;
  for($i=strlen($var)-1;$i>=0;$i--)
  {
    $temp=1;
    for($j=strlen($var)-1;$j>$i;$j--)
    {
      $temp*=26;
    }
    if($var[$i]!='Z')
    $res+=(ord($var[$i])-64)*$temp;
    else {
      $res+=$temp*26;
    }
  }
  return $res;
}
while($n--)
{
fscanf(STDIN,"%s",$str);
  if($str[0]=='R'&& IsInt($str[1]) && IsType1($str))
  {
    $a=GetInt($str);
    $b=GetInt_D($str);
    echo conversion_int($b).$a."\n";
  }
  else {
    $a="";
    for($i=0;$i<strlen($str);$i++)
    {
      if(!IsInt($str[$i]))
      {
        $a.=$str[$i];
      }
      else {
        break;
      }
    }
    $b=GetInt_D($str);
      echo 'R'.$b.'C'.conversion_str($a)."\n";

  }
}
?>

POJ 2273 An Excel-lent Problem http://poj.org/problem?id=2273

简化版 LeetCode 168 | Excel Sheet Column Title  https://leetcode.com/problems/excel-sheet-column-title/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Google搜索命令“site:”运算符高级使用技巧:

    *号技巧: 搜索“maps.*.com”可得到所有以maps.xxx.com作为域的网站内容,不过可惜的是Google不会给你全部匹配的结果,只有一部分 你可以...

    Enjoy233
  • C++版 - 剑指offer 面试题18: 树的子结构(LintCode 245.Subtree) 题解

    提交网址: http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=1...

    Enjoy233
  • C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解

    在线提交 - 牛客网: https://www.nowcoder.com/pat/6/problem/4050 或 PTA (拼题A) | 程序设计...

    Enjoy233
  • Swift 5.1 新特性

    Swift 5.1 内置于 Xcode 11,新增了很多新特性,比较重要的有以下几个。

    YungFan
  • 论文扫读-隐私保护+机器学习系列04*

    Privacy-Preserving Machine Learning 2018: A Year in Review

    安包
  • 前端学习(45)~正则表达式

    作用:计算机可以根据正则表达式,来检查一个字符串是否符合指定的规则;或者将字符串中符合规则的内容提取出来。

    Vincent-yuan
  • 通过欧拉计划学Rust编程(第684题)

    由于研究Libra等数字货币编程技术的需要,学习了一段时间的Rust编程,一不小心刷题上瘾。

    申龙斌
  • C++雾中风景12:聊聊C++中的Mutex,以及拯救生产力的Boost

    C++从11开始在标准库之中引入了线程库来进行多线程编程,在之前的版本需要依托操作系统本身提供的线程库来进行多线程的编程。(其实本身就是在标准库之上对底层的操作...

    HappenLee
  • 脑机接口需要我们掌握什么样的知识?

    想要说清楚脑机接口需要什么样的知识,首先得需要明白脑机接口是什么以及它的主要目的。

    脑机接口社区
  • Roman to Integer

    问题:罗马数字变为整数 class Solution { public: int romanToInt(string s) { cha...

    用户1624346

扫码关注云+社区

领取腾讯云代金券