标签:数值 strlen git ini main border class init 题目
最近偶尔接触到这个赛码网,看了百度的一道编程题,于是尝试了一下,发现虽然天天写代码实现这个居然花了我好长时间,仍然没有通过全部案例。目前给的通过率是83%
题目如下:
小B最近对电子表格产生了浓厚的兴趣,她觉得电子表格很神奇,功能远比她想象的强大。她正在研究的是单元格的坐标编号,她发现表格单元一般是按列编号的,第1列编号为A,第2列为B,以此类推,第26列为Z。之后是两位字符编号的,第27列编号为AA,第28列为AB,第52列编号为AZ。之后则是三位、四位、五位……字母编号的,规则类似。
表格单元所在的行则是按数值从1开始编号的,表格单元名称则是其列编号和行编号的组合,如单元格BB22代表的单元格为54列中第22行的单元格。
小B感兴趣的是,编号系统有时也可以采用RxCy的规则,其中x和y为数值,表示单元格位于第x行的有第y列。上述例子中的单元格采用这种编码体系时的名称为R22C54。
小B希望快速实现两种表示之间的转换,请你帮忙设计程序将一种方式表示的坐标转换为另一种方式。
|
输入
输入的第一行为一个正整数T,表示有T组测试数据(1<=T<=10^5)。随后的T行中,每行为一组测试数据,为一种形式表示的单元格坐标。保证所有的坐标都是正确的,且所有行列坐标值均不超过10^6。
|
样例输入
2 R23C55 BC23
|
|
输出
对每组测试数据,单独输出一行,为单元格坐标的另一种表示形式。
|
样例输出
BC23 R23C55
|
|
时间限制
C/C++语言:1000MS 其他语言:3000MS |
内存限制
C/C++语言:65536KB 其他语言:589824KB |
代码如下(希望高手可以不吝赐教):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
char Alph26[26+1]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘,‘I‘,‘J‘,‘K‘,‘L‘,‘M‘,‘N‘,‘O‘,‘P‘,‘Q‘,‘R‘,‘S‘,‘T‘,‘U‘,‘V‘,‘W‘,‘X‘,‘Y‘,‘Z‘};
void init(char *instr,const int length){ memset(instr,‘\0‘,length); }
void deal(char *instr);
void transAlph2Num(const char *instr,int outNum);
void transNum2Alph( int inNum,char *outAlph);
int isRCMode(const char *instr);
int findChr(const char *instr,const char c);
int squareBase26(const unsigned int square )
{
if( 0 == square )
return 1;
else
return 26*squareBase26(square-1);
}
char changeNumTo26Num(int inNum)
{
return Alph26[inNum-1];
}
int changeCharTo26Num(char inNum)
{
for(int i = 0 ; i < 26 ; i ++)
{
if( inNum == Alph26[i] )
return i+1;
}
return 0;
}
int main()
{
int size = 0;
//printf("%s","pls input the Num:");
scanf("%d",&size);
char instr[10+1];
init(instr,11);
while( size > 0)
{
init(instr,11);
//printf("%s","pls input the cha:");
scanf("%s",instr);
deal(instr);
size-- ;
}
return 0;
}
void deal(char* instr)
{
int rNum = 0;
int cNum = 0;
char crNum[10+1];
char ccNum[5+1];
init(crNum,11);
init(ccNum,6);
//printf("111111\n");
//printf("isRCMode==[%d]\n",isRCMode(instr));
if( isRCMode(instr) > 0 )
{
//printf("22222\n");
strncpy(crNum,instr+1,findChr(instr,‘C‘) - 1);
strncpy(ccNum,instr+findChr(instr,‘C‘)+1,strlen(instr) - findChr(instr,‘C‘) - 1 );
cNum = atoi( ccNum );
//cNum = atoi( ccNum );
//printf("crNum==[%s]ccNum==[%s]\n",crNum,ccNum);
char outcrNum[5+1];
init(outcrNum,6);
transNum2Alph( atoi(ccNum),outcrNum );
//printf("crNum==[%s]ccNum==[%s]\n",crNum,ccNum);
printf("%s\n",strcat(outcrNum,crNum) );
}else
{
//printf("sssss\n");
int i = 0;
for( ; !isdigit( instr[i] ) ; i++ );
strncpy(ccNum,instr,i);
strncpy(crNum,instr+i,strlen(instr) - i);
int sum = 0;
for(int j = 0 ; j < strlen(ccNum) ; j++ )
{
sum += changeCharTo26Num( ccNum[j] )*squareBase26( strlen(ccNum) - j - 1 );
}
printf("R%sC%d\n",crNum,sum);
}
}
int findChr(const char *instr,const char c)
{
for( int i = 0 ; i < strlen(instr) ; i++)
{
if( instr[i] == c )
return i;
}
return -1;
}
int isRCMode(const char *instr )
{
if(strlen(instr) < 4)
{
return -1;
}
if( -1 == findChr(instr,‘R‘) || -1 == findChr(instr,‘C‘) )
return -1;
if( findChr(instr,‘R‘) < ( findChr(instr,‘C‘) - 1 ) )
{
char tmp[5+1];
init(tmp,6);
strncpy( tmp, instr + findChr(instr,‘R‘) + 1, findChr(instr,‘C‘) - 1 - findChr(instr,‘R‘));
if(isdigit(tmp[0]))
return 1;
else
return -1;
}
return -1;
}
void transNum2Alph( int inNum,char *outAlph)
{
int value = 0;
int left = 0;
int Num = inNum;
char tmp[5+1];
init(tmp,6);
//printf("Num==[%d]\n",Num);
while( Num / 26 != 0 )
{
value = Num / 26;
left = Num % 26;
Num = value;
//printf("inNum==[%d]\n",value);
outAlph[0] = changeNumTo26Num( left );
outAlph[1] = ‘\0‘;
//printf("outAlph==[%s]\n",outAlph);
strcat(outAlph,tmp);
strcat(tmp,outAlph);
}
//printf("outAlph==[%s]\n",outAlph);
//printf("value==[%d]\n",value);
//printf("outAlph==[%s]\n",outAlph);
init(tmp,6);
sprintf( tmp,"%c", changeNumTo26Num( Num ));
//printf("tmp==[%s]\n",tmp);
strcat(tmp ,outAlph);
init(outAlph,strlen(outAlph));
strcpy(outAlph,tmp);
}
标签:数值 strlen git ini main border class init 题目
原文地址:http://www.cnblogs.com/XiongWinds/p/6772462.html