在oj时遇到一个题
题目本身并不是很难,但在一个数据时出了错,刚开始一直没想通是哪里出了错
下面为源代码
#include <bits/stdc++.h>
using namespace std;
int n;
char s[];
int main()
{
scanf("%d",&n);
scanf("%s",s); for(int i=;s[i]!='\0';i++)
{
s[i]+=(n%);
if(s[i]>'z') s[i]-=;
}
printf("%s",s);
return ;
}
在输入为如下时,无法通过:
25
xyz
后面去查了ascii表发现,小写字母已经非常接近的末尾了
x+25后已经超出char型的127范围,根据汇编这里应该已经是一个负值了,再减去26也无济于事,所以导致产生错误
随后选择直接在‘a’的基础上计算位移,避免直接在char型上进行加减,成功AC
#include <bits/stdc++.h>
using namespace std;
int n;
char s[];
int main()
{
scanf("%d",&n);
scanf("%s",s); int ans;
for(int i=;s[i]!='\0';i++)
{
ans=(s[i]-'a'+n)%;
s[i]=ans+'a';
}
printf("%s",s);
return ;
}