去逛了一下题解,发现题解在一些情况下是错误的,检测是不是不够准确?
查看原帖
去逛了一下题解,发现题解在一些情况下是错误的,检测是不是不够准确?
878182
deepicy楼主2022/11/18 00:39

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

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了。 请问是不是题目给予的测试数据不够准确,而第二个代码是不是更加准确?

2022/11/18 00:39
加载中...