A表示1,B表示2,…,Z表示26,AA表示27,AB表示28,BA表示53…
①:给出字母表达式输出代表的数字
这个比较简单,就当作26进制向十进制的转换就OK了。例如A =1 * 26的0次方
AA=1 * 26的1次方+1 * 26的0次方=27 BA=2 * 26的1次方+1 * 26的0次方=53
②:给出数字输出对应的字符串
其实第一想法是用辗转相除法求十进制数的26进制,然后再让1对应A,2对应B的进行转换。对于27对应的26进制数为11,就转为AA,但对于26对应的26进制数为10,转换过程不能转成Z,因此需要处理一下。代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int a[20],j=0;
while(n>0)
{
int t=n%26;
if(t==0)//如果n是26的倍数,则此处做让t=26的处理
t=26;
a[j++]=t;
n=(n-t)/26;//并且这里本来的n=n/26改为n=(n-t)/26。
//从而得到我们想要的26对应Z。使得跟Z有关的数字都能输出正确!
}
for(int i=j-1;i>=0;i--)
{
char ch=a[i]+'A'-1;
cout<<ch;
}
cout<<endl;
}
return 0;
}
若是已经规定了变化范围就是固定的几位 如三位 AAA-ZZZ
二位AA-ZZ,求第几个字符串或者倒数第几个字符串,则不需要上面的那种操作
例如:PTA-倒数第n个字符串
#include<bits/stdc++.h>
using namespace std;
int main()
{
int L,N;
cin>>L>>N;
int a[7],j=0;//对A~Z进行0~25的标号。相当于就是个10进制到26进制的转换,最终把数字转换为对应的字符
long long sum=pow(26,L)-N;//由于从0开始标号,所以倒数第N个就是正数第pow(26,L)-N个。
while(L--)
{
a[j++]=sum%26;
sum/=26;
}
for(int i=j-1;i>=0;i--)
{
char ch=a[i]+'a';
cout<<ch;
}
cout<<endl;
}