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]; }
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16146291.html