对一个大佬的STL题解有点疑惑?为啥不用考虑n很大的情况?

P1914 小书童——凯撒密码

RingTouSou @ 2023-09-14 23:05:00

#include<bits/stdc++.h>
using namespace std;
string a,zi("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
int main()
{
    int n;
    cin>>n>>a;
    for(int i=0;i<=a.length()-1;i++)
        cout<<zi[zi.find(a[i])+n];
    return 0;
} 

by One_JuRuo @ 2023-09-14 23:29:15

@RingTouSou

可能是什么黑科技吧,但是不建议用,当n真的大的时候是会错的,比如n是500的时候。

理论上n较大的时候,越界就应该会错,因为字符串最多在最后加一个 \0,这样访问确实会越界,至于为什么在n较小且明显越界的情况下可以对,我也不知道qwq


by RingTouSou @ 2023-09-14 23:32:23

@One_JuRuo 谢谢大佬!


by One_JuRuo @ 2023-09-14 23:42:52

@RingTouSou 刚刚又想了一下,猜测是数据根本没有出 n 大于 26 的情况,因为这个代码重复了两遍,所以没有越界,不过,这个题没有给 n 的范围,所以不清楚,实际上,你可以尝试把 n +'a'-1,这样就可以转为 char,然后输出,通过洛谷的错误点预览看自己输出的有没有不是小写字母的,如果有就代表出现过 n>26 否则就不超过 26

其他情况建议直接 %26 保证不会越界。

另外,我直接循环输出,会发现超过范围就会乱码,但是单独输出时,200 多的时候依然可以输出小写字母,500 的样子会输出大写字母,再大一点就是其他字符或者空白。非常玄学,个人不清楚是为什么。


by RingTouSou @ 2023-09-15 10:55:46

@One_JuRuo 好的,谢谢佬 但确实感觉有时候写洛谷这些数据有点玄学


|