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

posted @ 2026-03-09 21:56  shuiwangrenjia  阅读(3)  评论(0)    收藏  举报