• 1B踩坑大王


    题目链接

    题目大意:

    人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统:

    第一列被标为 A,第二列为 B,以此类推,第 2626 列为 Z。接下来为由两个字母构成的列号: 第 2727 列为 AA,第 2828 列为 AB ⋯\cdots 在标为 ZZ 的列之后则由三个字母构成列号,如此类推。

    行号为从 1 开始的整数。

    单元格的坐标由列号和行号连接而成。比如,BC23 表示位于第 55 23 行的单元格。

    有时也会采用被称为 RXCY 的坐标系统,其中 X 与 Y 为整数,坐标 ,Y) 直接描述了对应单元格的位置。比如,R23C55 即为前面所述的单元格。

    您的任务是编写一个程序,将所给的单元格坐标转换为另一种坐标系统下面的形式。

     

    解题思路:

    1. 首先判断是哪一种表示方法,我用的类似于枚举样式:
      cpp
      bool check(){	int n; 	n = strlen(s);	if(s[0] == 'R')	{		int j = 1;		while(check_count(s[j]) && j < n) j ++ ;		if(j == 1) return false;				if(s[j] == 'C') return true;	} 	return false;}
    2. 写转换函数change1/change2:
      cpp
      void change1(){	string a1 = "", a2 = "";	int n = strlen(s);	int i = 1;	for ( ; i < n; i ++ )	{		if (!check_count(s[i])) break;		a1 += s[i];	}	int res = 0;	i ++;	for( ; i < n; i ++ )	{		res = res * 10 + s[i] - '0';	} 	while (res)	{		char p;		int t = res % 26;		if(!t) 			p = 'Z';		else 			p = t - 1 + 'A';		a2 = p + a2 ;		if(!t) res = res / 26 - 1;		else res = res / 26;	} 	cout << a2 << a1 << '\n';} void change2(){	int n;	n = strlen(s);	int i = 0;	string s1 = "R", s2 = "C";	for( ; i < n; i ++ )	{		if(check_count(s[i])) break;	}		for( ; i < n; i ++ )	{		s1 += s[i];	}		string t = "";	for(int i = 0; i < n; i ++ )	{		if (check_count(s[i])) break;		t += s[i]; 	}		int res = 0;	for(int i = 0; i < t.size(); i ++ )	{		res = res * 26 + t[i] - 'A' + 1;	}		string tt = to_string(res);	s2 += tt;	cout << s1 << s2 << '\n';}

    本题踩的坑:

     首先这个26进制非我们常见的二进制,他不可以出现0.就。出现0代表他是“Z”,还有我们不能使其是26的倍数,这里用一个特判,如果是26的倍数,我们将其减一就好了。如:

    cpp
    while (res)	{		char p;		int t = res % 26; //0代表他是最后一个字母 		if(!t) 			p = 'Z';		else 			p = t - 1 + 'A';		a2 = p + a2 ;		if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0 		else res = res / 26;	}

    本题AC代码:

    cpp
    #include  using namespace std; char s[100]; bool check_count(char a){	if (a >= '0' && a <= '9') return true;	return false;} void change1(){	string a1 = "", a2 = "";	int n = strlen(s);	int i = 1;	for ( ; i < n; i ++ )	{		if (!check_count(s[i])) break;		a1 += s[i];	}	int res = 0;	i ++;	for( ; i < n; i ++ )	{		res = res * 10 + s[i] - '0';	} 	while (res)	{		char p;		int t = res % 26; //0代表他是最后一个字母 		if(!t) 			p = 'Z';		else 			p = t - 1 + 'A';		a2 = p + a2 ;		if(!t) res = res / 26 - 1; //不能是26的整数倍,因为该进制数中不可以出现0 		else res = res / 26;	} 	cout << a2 << a1 << '\n';} void change2(){	int n;	n = strlen(s);	int i = 0;	string s1 = "R", s2 = "C";	for( ; i < n; i ++ )	{		if(check_count(s[i])) break;	}		for( ; i < n; i ++ )	{		s1 += s[i];	}		string t = "";	for(int i = 0; i < n; i ++ )	{		if (check_count(s[i])) break;		t += s[i]; 	}		int res = 0;	for(int i = 0; i < t.size(); i ++ )	{		res = res * 26 + t[i] - 'A' + 1;	}		string tt = to_string(res);	s2 += tt;	cout << s1 << s2 << '\n';} bool check(){	int n; 	n = strlen(s);	if(s[0] == 'R')	{		int j = 1;		while(check_count(s[j]) && j < n) j ++ ;		if(j == 1) return false;				if(s[j] == 'C') return true;	} 	return false;} void solved(){	cin >> s;	if(check())	{		change1();	}	else 	{		change2();	}} int main(){	int t;	cin >> t;	while (t--)	{		solved();	} 	return 0;}

     


    __EOF__

  • 本文作者: Luli&
  • 本文链接: https://www.cnblogs.com/msluli/p/16897503.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    串流直播流媒体视频发布平台功能模块和产品技术参数
    初见物理引擎库Cannon.js(2)
    手写一个PrattParser基本运算解析器3: 基于Swift的PrattParser的项目概述
    笔记36:CNN的多通道卷积到底是什么样的
    华为交换机S5700系列产品命名规则
    msvcp120.dll怎么修复?msvcp120.dll丢失的解决方法
    Next.js项目初始化(附gitHub地址)
    阿里云服务器介绍_优势及新手购买流程
    Python新手常犯的8个错误,你中招了吗?
    Postgresql源码(88)column definition list语义解析流程分析
  • 原文地址:https://www.cnblogs.com/msluli/p/16897503.html