为什么只有60啊???大佬求解!!!

P1914 小书童——凯撒密码

cjnoy @ 2022-12-30 14:44:43

#include<iostream>
#include<string>
using namespace std;

int main()
{
    int n;
    string a;
    cin >> n;
    cin >> a;
    int i;
    for (i = 0; i < a.size(); i++)
    {
        a[i] = a[i] + n;
        if (a[i] > 'z')
            a[i] = a[i] - 26;
    }
    cout << a;
    return 0;
}

by xhz0311 @ 2022-12-30 14:45:55

n>26呢?题目可没有保证这一点啊。


by xhz0311 @ 2022-12-30 14:46:06

@cjnoy


by 2345A @ 2022-12-30 14:53:51

@cjnoy


#include <iostream>
using namespace std;
int main()
{
    string a;
    int b, i, j;
    cin >> b;
    cin >> a;
    for(i=0;i<=a.size()-1;i++)
    {
        for (j = 1; j <= b; j++)
        {
            a[i]++;
            if (a[i] > 122)
            {
                a[i] = 97;
            }

        }
    }
    cout << a;
    return 0;
}

by cjnoy @ 2022-12-30 15:20:26

@xhz0311

n大于26,我试了一下,没有问题诶


by cjnoy @ 2022-12-30 15:23:28

@baiqian

谢谢大佬!但是我想知道为什么原先那个代码有WA的地方嘞


by 2345A @ 2023-01-02 12:02:21

@cjnoy 要-1

for(i=0;i<=a.size()-1;i++)

for (i = 0; i < a.size(); i++)


by bluetored @ 2023-02-10 10:44:33

@cjnoy 不知道你现在会了吗,我的第一次代码跟你的差不多,改了两遍才AC.

  1. 首先第一个问题n的取值可能大于26的两倍,如果你这时给a[i]-=26是没有意义的,所以要先把n的值去%
  2. 然后就是关于ASCLL码的值,当你直接对字符+=n时,可能会超过ASCLL上限,然会就会有一些奇奇怪怪的东西,所以就可以另外声明一个int变量A来装字符对应的ASCLL码值。 代码如下
    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
    int n;
    string s;
    cin >> n>>s;
    n %= 26;
    for (int i = 0; i < s.size(); i++) {
    int x = s[i] + n;
    if (x > 'z')s[i] = x - 26;
        else s[i] = x;
    }
    cout << s;
    return 0;
    }

by cjnoy @ 2023-02-23 19:11:51

@bluetored 原来是这样,看了大佬的解释就会啦,很感谢很感谢!!!


|