看起来像进制转换,其实有些小巧思,整个进制转换过程中没有0 而多了26
#include <iostream>
#include <math.h>
using namespace std;
long long n;
char s[1000000];
int main()
{
cin>>n;
int t=0;
while(n>0){
s[t++]='A'+(n-1)%26;//s[t++]=n%10;对应0-9 25->z即可
//26我想要的是0Z 也就是个位中的最后一个 而我正常算会得到
//A0的第一个 高位和低位都多了一个 按照正常算应该减1 意思是26是不可进位的 26->25所以也减一
n=(n-1)/26;
}
t--;
while(t>=0){
printf("%c",s[t--]);
}
return 0;
}
问题出在每次进位的时候 即由26->27也就是Z变AA的时候 Z应该表示为0-25的最后一个 而不应该表示为A0 为了此时不发生进位 我们把26减1再mod26即可
实质是每次进位时加多了一个1
所以由十进制转回类26进制需要进行修正,即每次减1再运算,相应的下次除26取整的时候这个n也应该-1再进行运算。
映射:0->A 25->Z