天天看点

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

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;
}