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]);            //而我们输出的时候是要从左往右输出的
        
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈童学哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值