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