题目链接:http://codeforces.com/problemset/problem/1/B
①题意描述
②代码实现
③注意点和思路
①题意描述:有两种表格位置的描述方式,第一种是RXCY的形式,其中X和Y是正整数,分别代表行标和列标;第二种用字母加数字的形式,字母代表列表数字行标(和excle规则一样)。
第一行输入一个数n,代表n组询问。然后接下来n行每行输入以上两种形式的其中一种。
输出n行,每行对应输入询问的另一种表示方式。
输入:
2 R23C55 BC23
输出:
BC23 R23C55
②代码如下:
#include <cstdio>
#include <string.h>
char sp[1001];
char ans[1001];
void Tonumber(int length)
{
int i = 0;long long a = 0,b = 0;int temp = 1;
while(sp[i]>='A'&&sp[i]<='Z')
{
a*=26;
a+=(sp[i]-'A'+1);
i++;
}
while(i<length)
{
b*=10;b+=(sp[i]-'0');
i++;
}
printf("R");
printf("%lld",b);
printf("C");
printf("%lld\n",a);
// memset(ans,0,sizeof(ans));
}
void Toexcle(int length)
{
int i = 1;int a = 0,b = 0;
while(sp[i]!='C')
{
if(i==length)
{Tonumber(length);return ;//R开头没C的判断
}
a*=10;a+=(sp[i]-'0');
i++;
}
while(1)
{
i++;
if(i>=length) break;
b*=10;b+=(sp[i]-'0');
}
//数字提取
int j = 0;int k1,k2;
while(1)
{
k1 = b % 26;
if(k1)
ans[j]=(b%26)+'A'-1;
else ans[j] = 'Z';
b/=26;
if(ans[j]=='Z')b--;
if(!b)break;j++;
}
//进制转换
k2 = strlen(ans);
while(k2--)printf("%c",ans[k2]);
printf("%d\n",a);
//答案输出
memset(ans,0,strlen(ans));
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%s",&sp);
m = strlen(sp);
if(sp[0]=='R'&&sp[1]<'A')Toexcle(m);//R开头第一步判断
else Tonumber(m);
memset(sp,0,m);
}
return 0;
}
③注意点以及思路:
十进制转excle一直对26取模,取出的数依次存到数组中,如果这个模数等于26(Z)那么对商进行-1操作。
excle转十进制就简单了很多从最高位取数把字母次序取出加到计数器sum上,未取完则sum乘26然后重复前面操作,直到所有数全部取完。
!!!!!!!注意两种类型的判定!!!