去逛了一下题解,发现题解在一些情况下是错误的,检测是不是不够准确?

P1914 小书童——凯撒密码

deepicy @ 2022-11-18 00:39:54

去看了一下题解,发现了一点问题。 这是其中一个题解代码:

using namespace std;
int main()
{
    char a[200];//开个大点的字符串
    int n,i,la,b[200];//b数组用来转换
    cin>>n>>a;
    la=strlen(a);//取长度
    for(i=0;i<la;i++)
        b[i]=a[i];//转换
    for(i=0;i<la;i++)
        b[i]=b[i]+n;//破解密码
    for(i=0;i<la;i++)
    {
        if(b[i]>122)//z的ASCLL码是122
            b[i]=b[i]%122+96; //循环会'a',a的ASCLL码是96
    }
    for(i=0;i<la;i++)
    {
        a[i]=b[i];//转换回去,输出
        cout<<a[i];
    }
    return 0;
}

而n=40的时候,输入afz,会输出ot?。 当n=40时,在第三个循环中b[i]=164,经过计算后,b[i]的值明显超过128,在下面强制类型转换后会让该值失真,并输出错误答案。 而正确答案应该是otn。以下是根据题解思路写出来的代码:

#include <string.h>
int main()
{
    int a,b,d,e[50]={0};
    char c[50]={0};
    scanf("%d",&a);
    scanf("%s",c);
    b=(strlen(c))-1;
    if(a>26){
        a=a%26;
    }
    while(a!=0){
        for(d=0;d<=b;d++){
            e[d]=c[d];
        }
        for(d=0;d<=b;d++){
            e[d]=e[d]+a;
            if(e[d]>122){
                e[d]=e[d]%122+96;
            }
            }
            for(d=0;d<=b;d++)
            c[d]=e[d];
            break;
    }
    printf("%s\n",c);
    return 0;
}

我将两个代码交给oj,都给ac了。 请问是不是题目给予的测试数据不够准确,而第二个代码是不是更加准确?


by ChampionYoung @ 2022-11-18 08:56:36

可能是入门题, n 比较小,所以没卡住(去翻了翻,发现很多题解,包括我,都忘了把 n 取模)

或许可以加 hack


|