1B - Spreadsheet

原题链接

这题我写的时候各种bug层出不穷,这里记录一下大神的方法,太凝练了!不得不说,我的代码能力及其垃圾。

题意:给你一个字符串,要求你实现十进制和二十六进制的相互转换

思路:首先就是简单的预处理弄出输入信息,然后进行转换后输出即可,但是很容易出bug。

大佬代码

#include<cstdio>
void g(int t) {    //十进制转二十六进制的关键函数
	if(t) {
		g((t-1)/26);
		putchar(65+(t-1)%26);
	}
}
int main() {
	int n,x,y;
	char s[64],*p;
	for(scanf("%d ",&n); n--;) {
		gets(s);
		if(sscanf(s,"%*c%d%*c%d",&x,&y)==2) {
			g(y);
			printf("%d\n",x);
		} else {
			for(x=0,p=s; *p>64; ++p) {
				x=x*26+*p-64;
			}
			printf("R%sC%d\n",p,x);
		}
	}
	return 0;
}

我的拙劣代码

string s;

bool judge(char c)
{
	if(c >= 'A' && c <= 'Z') return true;
	return false;
}

int main()
{
	int T;
	cin >> T;
	while(T --)
	{
		cin >> s;
		int col = 0, row = 0;
		int k = 0, type = 1;
		while(judge(s[k])) k ++;
		while(k < s.size() && !judge(s[k]))	k ++;
		if(k < s.size() && judge(s[k])) type = 0;
		if(type)
		{
			int d = 0;
			while(judge(s[d])) col = col * 26 + (s[d] - 'A' + 1), d ++;
			while(d < s.size()) row = row * 10 + s[d] - '0', d ++;
			
			printf("R%dC%d\n", row, col);
		}
		else
		{
			int d = 1;
			while(!judge(s[d])) row = row * 10 + s[d] - '0', d ++;
			d ++;
			while(d < s.size()) col = col * 10 + s[d] - '0', d ++;
			v.clear();
			while(col)
			{
				v.push_back(col % 26);
				col /= 26;
			}
			for(int i = 0 ; i < v.size() ; i ++) 	if(v[i] <= 0 && i < v.size() - 1) v[i] += 26, v[i + 1] --;
			for(int i = v.size() - 1 ; i >= 0 ; i --)
			{
				if(v[i] == 0) continue;
				cout << (char)(v[i] + 'A' - 1);
			}
			cout << row << endl;
		}
	}
	return 0;
}
posted @ 2021-04-02 11:13  beatlesss  阅读(75)  评论(0编辑  收藏  举报