解题思路:
1.传统的进制转换数码都是从0开始的,例如8进制,数码是0 1 2 3 4 5 6 7,n进制的数码就是0 1 2 ... n-1,逢n进位,当前位变为0
2.但是本题的进制转换我们可以看成是特殊的26进制,他的数码不是从0开始的,而是从1 2 ... 26 分别对应的字母是A B .... Z
3.这个26进制,不是逢26进位,逢26不进位,而是逢26+1才进位,而且是高位进1,而当前位也为1
4.因为这个特殊性,我们不能简单的用n%26 得到该位的上的数字(或字母)
5.如果n%26为0时,当前位数字设为26(即字母Z),否则n%26余数即为当前位上的数字(1-25),字母(A-Y)
6.如果n%26为0时,由于不进位,所以,其商也会减少1。即商=n/26-1
注意事项:
参考代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n;
cin>>n;
//十进制转26进制 0~25
/*
1-A 1
2-B
..
26-Z
(n-1)%26 +'A'
*/
char ans[10000];
int cnt=0;
while(n){
char c;
c=n%26+'A'-1;//余数1~26转换对应的字母,其中余数0转为'A'-1
if(n%26==0)c='Z';//余数为0时,修正转换的字母
ans[cnt++]=c;//存储字母
if(n%26==0){//如果余数为0
n/=26;//先进位
n--;//再把进的位减掉
}else{
n=n/26;
}
}
for(int i=cnt-1;i>=0;i--)cout<<ans[i];
return 0;
}0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<bits/stdc++.h> using namespace std; char ch[26],cnt=1; int main(void){ for(int i='A';i<='Z';i++){ ch[cnt++]=i; } int n,t; cin>>n; /*for(int i=0;i<cnt;i++){ cout<<ch[i]<<" "; }*/ int flag=1,tot; while(flag){ tot=n; if(n<=26){ if(n%26==0)int ss = n/26; cout<<ch[n]; break; } else if(n>26&&n%26==0){ int k = (n/26); cout<<ch[k]; k-=1; int tmp =n-(k*26); cout<<ch[tmp];if(tot/=26){ flag =1; } flag = 0; } else{ t = n/26; cout<<ch[t]; cout<<ch[n%26]; if(tot/=26){ flag =1; } flag = 0; } } return 0; }