首页 > 其他分享 >1B踩坑大王

1B踩坑大王

时间:2022-11-16 21:14:23浏览次数:62  
标签:26 int res 单元格 else 1B 大王 check

题目链接

题目大意:

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

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

行号为从 1 开始的整数。

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

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

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

 

解题思路:

  1. 首先判断是哪一种表示方法,我用的类似于枚举样式:
    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:
    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的倍数,我们将其减一就好了。如:

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代码:

#include <bits/stdc++.h>

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;
}

 

标签:26,int,res,单元格,else,1B,大王,check
From: https://www.cnblogs.com/msluli/p/16897503.html

相关文章

  • 20221111_T1B_线段树优化建图/并查集
    题意给定一个字符串,其中只有a和b,现在一个字符能够跳到与之中间a的个数范围在\([l,r]\)的东西。题解赛时得分:100/100对于一个东西,显然如果将能相互到达连边,那么......
  • 洛谷 [AGC021B] Holes 蓝 题解
    前言学校基础模拟赛的题,当时有思路但是不太会写凸包就没做,下来看了看,自己的思路大部分是正确的,有些细节没有想到,在此写篇题解。我用的是Andrew求凸包。思路答案为0......
  • 问题 I: 零基础学C/C++172——猴子选大王
    提示中也说了,这题可以用循环列表来实现,但是其实我也不怎么会哈哈哈哈,这题也同样可以用简单的基础语法来实现,只不过我们需要对一个循环语句做些手脚,让他头尾相连。点击查......
  • 数字逻辑笔记 全加器全减器8421BCD转余3
    二进制全加器全减器十进制加法8421BCD转余3码......
  • 01bfs 小专题
    概括:边权为0/1的图求最短路,常见于网格图的bfs。本质是特殊的dijkstra,因为边权只有0/1,不再需要优先队列维护Luogu4667注意需要维护的是格点的坐标和格子的坐标,然后边权如......
  • CF461B
    设\(f_{u,0/1}\)表示以\(u\)为根的子树,\(u\)所在的联通块内有\(0/1\)个黑点的方案数。设\(v\)为\(u\)当前枚举到的儿子。则转移方程为:\(f_{u,1}=f_{u,1}\tim......
  • 瓜子大王洽洽,困于“无效营销”
    文|螳螂观察作者|图霖瓜子大王洽洽,近期的股价有些“上火”。同花顺20日数据显示,洽洽食品最近5个交易日下跌6.46%。受此影响,同日,洽洽被深股通减持42.99万股。据了解,洽洽已连......
  • [CF311B]Cats Transport
    [CF311B]CatsTransport思路我们发现每只小猫有两个对接走时间有影响的参数\(D_i\)和\(T_i\),而实际上我们只需要知道每只小猫刚好被接走的最小出发时刻是多少。所以......
  • "0x00a1bdb3" 指令引用的 "0x00000001" 内存。该内存不能为 "read"。
    笔记本换成XP系统后,单击我的电脑或者别的时候,有时会提示,下面的错误提示:---------------------------IExplore.exe-应用程序错误---------------------------"0x00a1bdb3"......
  • DEMO:MB1B 311 移库 BAPI_GOODSMVT_CREATE
    *&---------------------------------------------------------------------**&ReportZDEMO_MB1B*&*&---------------------------------------------------------------......