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
可能是入门题,
或许可以加