PTA团体程序设计天梯赛-练习集: L1-050 倒数第N个字符串 ( 15分 )

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 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语言:
#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]);            //而我们输出的时候是要从左往右输出的
        
}

猜你喜欢

转载自blog.csdn.net/H1727548/article/details/129310489
今日推荐