百度2016实习 前端试题中的编程题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)
类似的中文题 蓝桥杯 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/
相关链接:
http://blog.youkuaiyun.com/qq_16542775/article/details/50834888
http://blog.youkuaiyun.com/NoMasp/article/details/50498759