【PTA】​L1-050 倒数第N个字符串 ​ (C++)

题目链接:L1-050 倒数第N个字符串 

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:人工智能教程

目录:

题目要求:

输入格式:

输出格式:

输入样例:

输出样例:

思路:

代码:

测试结果:


题目要求:

给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 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

思路:

1.先用m=pow(m,l)算出总共有多少种组合的可能

2.算出倒序输出的组合数位置

3.用%26的方式找到相对应的字母

4.最后倒序输出结果

程序将输入的整数n看作是一个26进制数(假设m = 26^l),然后计算m - n的值,并将结果转换为一个由小写字母组成的字符串,最后以逆序输出这个字符串。

例如,如果l = 3n = 130,则m = 26^3 = 17576a = m - n = 17576 - 130 = 17446。将这个26进制数转换为字母序列,我们得到'abb'(因为17446在26进制下是1001,对应于'a''b''b')。最后,程序将输出'bba'

头文件和命名空间:这包括了几乎所有的标准库,并使用了 std 命名空间。

#include <bits/stdc++.h>  
using namespace std;

主函数:这是程序的入口点。

int main()
 
{
 
       ....
 
}

定义变量: 

  1. 定义了两个整数变量ln,以及一个字符数组c,该数组能够存储最多1000个字符。

  2. 通过cin从标准输入读取ln的值。

int l,n;
char c[1000];
cin >> l >> n;

进行计算:

  1. 计算m = 26^l,这里26代表英文字母的数量,l是用户输入的一个整数。使用pow函数来计算幂。

  2. 计算a = m - n,其中amn的差。

int m = 26;
m = pow(m,l);
int a = m - n;

 循环转化:通过一个for循环,将a转换为一个长度为l的字符串,并存储在c数组中。转换的方式是将a对26取模,得到的结果加上'a'的ASCII值(即'a'对应的整数值),然后将a除以26。这个过程相当于将a看作是一个26进制的数,并将其转换为对应的字母序列。

for(int i = 0; i < l;i ++)
 {
     c[i] = a % 26 + 'a';
     a /= 26;
 }

最后,通过另一个for循环,以相反的顺序输出c数组中的字符,即先输出最后一个字符,然后输出倒数第二个字符,依此类推。

for(int i = l - 1; i >= 0; i --)
    cout << c[i];

结束程序:主函数返回0,表示程序正常结束。

return 0;  

代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int l,n;
    char c[1000];
    cin >> l >> n;
    int m = 26;
    m = pow(m,l);
    int a = m - n;
    for(int i = 0; i < l;i ++)
    {
        c[i] = a % 26 + 'a';
        a /= 26;
    }
    for(int i = l - 1; i >= 0; i --)
        cout << c[i];
    return 0;
}

测试结果:

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

妄北y

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

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

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

打赏作者

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

抵扣说明:

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

余额充值