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

赛码网的一道百度编程题

时间:2017-04-27 10:14:49      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:数值   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

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