这个题常见的26进制的题,但是存在一个小坑,我们来研究一下
1.将字符串转化为数字的时候比较简单,就是成26的0次1次..n次幂的问题
2.将数字转化为字符串的时候是有坑的,对于1*26^2+3*26^1+26*26^0,我们人力来算的话是ACZ,但是机器来算的话你除以26后产生一个1加到第二个字母上,致使第二个字母的C变成了D,其实我们也可以发现,我们A得到的是一个1,但是我们利用ACSII码来计算的时候,应该是'A'+0才是A,所以给我们提示是,对于任意的一次求字母的运算,在开始操作之前,先减1,就能消除所有烦恼
7-8 mmh学长的Excel表格 (20分)
mmh学长的Excel表格
在某件事情经过mmh学长的点播之后,小白尝试着给Excel表格编号。 A对应1,B对应2,以此类推,AA对应27,…………可是这样实在是太慢了, 怎么才能知道某个表格编号就知道它是第几列,或者知道它在第几列 就能快速推出表格编号呢?
输入格式:
第一行一个正整数T(T≤100000),代表T组测试数据。 接下来T行由以下形式给出: d X 本题数据全部随机且保证所涉及数据均在长整型范围内。
输出格式:
当d为1时,X为大写字母组成的字符串,为Excel某列的一个排列, 你需要输出它是第几列, 当d为2时,X为一个长整型(long long int)正整数,为Excel的第几列, 你需要输出他所对应的大写字母序列
输入样例:
2
1 A
2 1
输出样例:
1
A
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
int t;
int order;
string st;
ll number;
int main()
{
cin>>t;
while(t--)
{
cin>>order;
if(order == 1)
{
cin>>st;
ll power = 1;
ll sum = 0;
for(int i = st.length()-1; i >= 0; i--)
{
sum += ((st[i]-'A'+1)*power);
power *= 26;
}
cout<<sum<<endl;
}
else
{
cin>>number;
vector<char> result;
while(number)
{
number--;
ll temp = number % 26;
result.push_back('A'+temp);
number /= 26;
}
for(int i = result.size()-1; i >= 0; i--)
cout<<result[i];
cout<<endl;
}
}
return 0;
}