给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 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
思路:题目的意思是给定一个长度为L的字母全为a的字符串然后从末位一直往前加+1,例如aaa,它的后一个字符串是aab,当它到aaz时再往前+1时z是最后一个字母那它让它的前一个字母+1,也就是变为aba(相当于进制转换的问题),然后假设字符串aaa到zzz之间有M个数,而题目要我们求倒数第N个字符串是啥?嘶!!!求倒数的?这玩意听着好像不好求呢。既然如此,那我们就转换成正序的来求,倒序是第N个,那正序的应该就是总数K-N咯。而总数K怎么求呢?因为前面说了这个递增的玩意就相当于进制转换,那么我们只需要求取进制的字符串的长度次方啦!也就是K=26^L
C++:
#include<bits/stdc++.h> using namespace std; int main() { int n,m; //n为小写字母字符串的长度,m为倒数的第m个字符串 int b=26; cin>>n>>m; b=pow(b,n); //计算由n个字符‘a’到n个字符‘z’共有多少个字符串 m=b-m; //总的个数b减去倒数个数m即为正序的第b-m char a[n]; //定义一个字符数组用来储存长度为n的字符串 for(int i=0;i<n;i++) //循环遍历 { a[i]='a'+m%26; //每个字符是从字符‘a’开始,加上总数m除以26个字母的个数余下的数 m/=26; //总数再除以26 } for(int i=n-1;i>=0;i--) //逆序遍历输出,因为我们是从每个字符串的最后一个(从右往左)开始往上叠加, cout<<a[i]; //而我们输出的时候是要从左往右输出的 }
C语言:
u#include<stdio.h> #include<math.h> int main() { int n,m; //n为小写字母字符串的长度,m为倒数的第m个字符串 int b=26; scanf("%d %d",&n,&m); b=pow(b,n); //计算由n个字符‘a’到n个字符‘z’共有多少个字符串 m=b-m; //总的个数b减去倒数个数m即为正序的第b-m char a[n]; //定义一个字符数组用来储存长度为n的字符串 for(int i=0;i<n;i++) //循环遍历 { a[i]='a'+m%26; //每个字符是从字符‘a’开始,加上总数m除以26个字母的个数余下的数 m/=26; //总数再除以26 } for(int i=n-1;i>=0;i--) //逆序遍历输出,因为我们是从每个字符串的最后一个(从右往左)开始往上叠加, printf("%c",a[i]); //而我们输出的时候是要从左往右输出的 }