您的位置:首页 > 其它

PAT - 天梯赛 L1-050 倒数第N个字符串

2018-04-04 11:24 239 查看

L1-050. 倒数第N个字符串

时间限制400 ms
内存限制65536 kB
代码长度限制8000 B
判题程序Standard作者陈越
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。输入格式:输入在一行中给出两个正整数 L(2 <= L <= 6)和 N(<= 105)。输出格式:在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。输入样例:
3 7417
输出样例:
pat
思路:直接倒着对26取余,转化为26进制。然后之间用z - 对应的数字 直接输出就可以了
          但是要注意的是 如果正好是26的整数倍是 如:倒数第26个 应该是zza,但是转化成26进制就是010  其实应该是00 26。#include<cstdio>
#include<cstring>
using namespace std;

int main(){
int n, m, flag = 0, k;
int arr[20];
scanf("%d%d", &n, &m);
memset(arr, 0, sizeof(arr));
k = n-1;
for(int i = n; i >= 0; i--){//转化为26进制
if(m == 0) break;
int x = m % 26;
if(x == 0 && !flag) arr[i] = 26; // 要考虑 正好可以整除26时
else{ //一直遇到第一个除以26 余数不为0的 这个位数之前的应该全为a。 就像 10人为一对 第100个 是第10队的最后一个 而不是第11队
arr[i] = x;
if(!flag){
flag = 1;
k = i;
}
}
m /= 26;
}
char ch = 'z';
for(int i = 1; i <= n; i++){
if(i >= k){
printf("%c", ch - arr[i] + 1);
}
else printf("%c", ch - arr[i]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: