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

姥姥手下留情出的水题,但我调了将近一个小时才出来呜呜

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805080346181632

这道题目考察的是对于字符串的理解;

其实也不算是很难,但就是容易考虑不到点子上;

我们拿到题目首先肯定会考虑模拟,但这个题用模拟是大概率不成的:

个人认为有两点原因:

一、字符串模拟一般是不太好操作的

二、数据量很庞大,给你一个大数(在不超出数据范围的前提下)就很不会处理

我们采取这样的办法

题目求倒数第N个字符串,我们可以变为正向求,用总数-N即可。至于求法看下列例子:假设L=3,且只有10个字母a-j,分别用0-9表示,则aaa=000,aab=001,aac=002,aad=003,aae=004,aaf=005,aag=006,aah=007,aai=008,aaj=009,aba=010…
我们求正向数第11个数即aba=010,我们可以发现只需求3位中,每一位数字是多少即可,因为0-9分别表示a-j.怎样求呢?其实就是求十进制下,每一位的数字是多少,即010%10=0,个位为0,010/10%10=1,十位为1,010/10/10%10=0,百位为0.我们就求出来了,对于26个字母道理是一样的,只不过是26进制,按照求十进制的方法即可。注意:求出来的答案和要求的是想反的,因为答案要求先求最高位,但是我们只能先求最低位。

这样来看,题目就似乎好处理了

附上参考代码:

#include<bits/stdc++.h>//pta 倒数第n个字符串 
using namespace std;
int n;
int l;
string s;
int main()
{
    std::ios::sync_with_stdio(false);
    cin>>l>>n;
    int num=pow(26,l)-n;
    while(l--)
    {
        char ch=num%26+'a';
        s=s+(ch);
        num/=26;
    }
    for(register int i=s.length()-1;i>=0;i--)
    cout<<s[i];
}

 

posted @ 2022-04-14 20:02  江上舟摇  阅读(75)  评论(0编辑  收藏  举报