给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
using namespace std;
int main(){
int n,a,sum=1;
cin>>n>>a;
string str="";
for(int i=1;i<=n;i++)
{
str=str+"a";
sum=sum*26;
}
sum=sum-a;
while(sum/26!=0){
n--;
str[n]='a'+sum%26;
sum=sum/26;}
n--;
str[n]='a'+sum;
cout<<str<<endl;
return 0;
}
运行结果:
代码思路
- 字符串由
n
个连续的小写字母'a'组成,然后通过某种方式移除a
的个数(字母'a'相当于ASCII码的97)。 - 移除的方式是通过将字符串初始长度
n
乘以26(也就是将每个'a'视为26进制数的1),然后从这个累积值中减去给定的整数a
。 - 接下来,通过不断将差值(sum)除以26并取余数,将余数转换为对应的小写字母(ASCII码加97),放置在倒数第n个位置开始向前填充。
- 当差值不能再被26整除时,将剩余的差值转换为对应的小写字母,放在字符串的相应位置。
总结代码套路:
- 读入两个整数
n
和a
。 - 初始化字符串
s
为空,然后使用循环添加n
个'a'字符到字符串中。 - 计算总和
sum
,初始为26^n - a
,这代表了将n
个'a'看作是26进制数后的减法结果。 - 使用一个循环来逐步还原字符串,每次循环都将
sum
除以26并取余数作为新的字母值(加97转换为ASCII码),并将结果字符放入字符串的倒数第n
位,然后更新sum
为商。 - 当
sum
不再能被26整除时,最后一次将sum
转换为字符并添加到字符串的适当位置。 - 输出最终生成的字符串。
整体来看,这段代码的核心思路是基于26进制(类似于十六进制等其他进制)对给定的整数进行逆向编码操作,生成相应的字符串。