这题看似容易,实则暗藏玄机。
AC代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n,i;char str[51];
scanf("%d%s",&n,str);
for(i=0;i<strlen(str);i++)
str[i]=(str[i]-'a'+n)%26+'a';
puts(str);
return 0;
}
也很好理解,先得到每个字符相对于’a’的偏移量,加上n对26取余,再加上’a’还原成字符。
然而我一开始不是这么写的。
错误代码:
#include <stdio.h>
void decode(char* str,int n)
{
while(*str!='\0')
{
*str=*str+n;
if(n>26)
str-=26;
str++;
}
}
int main(int argc, char const *argv[])
{
int n,i;char str[51];
scanf("%d%s",&n,str);
decode(str,n);
puts(str);
return 0;
}
是我太短视,只看见了n很小,大概十几二十几的情况,实际上n可能是一个非常大的数字,这时就必须考虑char的取值范围问题,而且处理时也不能简单地减去26,而应该对26取余,因为这个n可能是1000,2000000等。