L1-050 倒数第N个字符串(得分20)(进制转换)
天梯赛L1-050传送门
感谢陈越大大的出题 😭😭😭
题目描述
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这个序列的倒数第27个字符串就是 zyz。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。
输入格式
输入在一行中给出两个正整数 L(2 ≤ L ≤ 6)和 N(≤10^5)。
输出格式
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。
解题思路
首先,这题在分析的过程中应该很容易想到进制转换,但是要怎么写就是另一回事了😎😭
为了ac这道题,需要先补充一些进制转换的知识
● 对于n进制的数,转换为m进制的数,具体过程如下:
#include<iostream>
#include<vector>
using namespace std;
//这里为了方便,就取n=10 ,m=2,反过来转换应该很简单
int main()
{
vector<int> ans;
int n;
cin>>n;
while(n)
{
ans.push_back(n%2);
n/=2;
}
for(int i = ans.size() - 1 ; i >= 0 ; i--) cout<<ans[i];
return 0;
}
//每次%得到的余数就是该位上对应的数,只不过输出的时候要倒着输出
同样的,我们可以把思路类比到这一题,先想一下,在上面的代码中,如果我转换的二进制数是111,但是我最后要输出7位,那么我要在前面补0;
小声告诉你:补0的逻辑在题解代码中有,可以先想一下
本题要求倒数第N个数,长度为L,那么长度为L的二十六进制数一共有26^L个,记为sum ,倒数第N个, 就是正数第(sum - N)个
注意这里是从0开始的,第0个到第(sum-1)个,因为该序号是有二十六进制映射到十进制上的,而二十六进制最小为0,最大为26^L-1;
那么现在的问题就是第(sum-N)个数对应的二十六进制数是啥,再看上面的例子,这不就相当于十进制的(sum-N)转换为二十六进制吗
几乎是套代码就能把二十六进制数算出来
最后
求出该数后,二十六进制数里的每一位(范围是0到25)就对应了字母a到z,将数字转化为字符即可,当然还需要上面说铺垫的补'a'
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
vector<int> str;
int main()
{
int l,n;
cin>>l>>n;
ll target = 1;
for(int i = 0 ; i < l ; i++) target *= 26;
target -= n;
while(target)
{
str.push_back(target % 26);
target /= 26;
}
for(int i = 0 ; i < l - str.size() ; i++) cout<<"a";
for(int i = str.size()-1;i>=0;i--) cout<<(char)('a' + str[i]);
return 0;
}
┏┛墓┗┓...(((m-__-)m

浙公网安备 33010602011771号