晶锐离鸿 @ 2018-11-30 07:53:40
int main() { int n; scanf("%d\n",&n); char a[60],i,t; gets(a); t=strlen(a); while(n>=26) n=n-26; for(i=0;i<t;i++) { a[i]=a[i]+n; } for(i=0;i<t;i++) { if(a[i]>122) a[i]=a[i]-26; printf("%c",a[i]); } }
by omemi @ 2018-11-30 08:01:10
gets()读入了输入n后的空格或换行符。
by omemi @ 2018-11-30 08:01:14
@晶锐离鸿
by ytxytx @ 2018-11-30 08:16:44
希望更丰富的展现?使用Markdown
by omemi @ 2018-11-30 15:15:14
好吧是我眼拙了
by 风萧萧兮 @ 2018-12-02 20:34:02
希望更丰富的展现?使用Markdown
by 晶锐离鸿 @ 2018-12-06 16:41:06
@omemi 内个,能不能告诉我怎么改啊? 我还是不太懂。
by omemi @ 2018-12-06 19:43:39
@晶锐离鸿
都这么七八天了老哥你还是没想出来啊orz
你把
scanf("%d\n",&n);
改成
scanf("%d",&n);
getchar();
试试
by omemi @ 2018-12-06 20:35:48
@晶锐离鸿
好吧我刚才的办法并不能AC
但是是个不错的习惯,你永远不知道输入n之后是个回车符还是空格符什么的,所以尽量把程序写得容错性更好一些
接下来我要讲这题你出现错误的原因
ASCII码的范围最大到127
这么说或者不太准确,应该说可以通过加减乘除计算的范围最大是127,超过了就会像超过整形最大值2^31-1那样出现负数等奇怪的数
我发现你已经做了如果a[i]大于122之后就让它减去26的判断
但是我们设想一下
n=26 a[i]为'z'时,他们加起来达到了147!
这个时候你再减去26已经无济于事了,因为已经不可运算了
那怎么办呢?
我们可以先把a[i]减去一个大于等于20的数(至于为什么是20请自己推论)
by omemi @ 2018-12-06 20:38:10
之后再加上n
最后输出的时候再加上20
这是个不错的题目
附上我修改后你的代码
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d\n",&n);
char a[60],i,t;
gets(a);
t=strlen(a);
while(n>=26) n=n-26;
for(i=0;i<t;i++)
{
a[i]=a[i]-20+n;
}
for(i=0;i<t;i++)
{
if(a[i]>122) a[i]=a[i]-26;
printf("%c",a[i]+20);
}
}
by omemi @ 2018-12-06 20:41:18
ASCII码的范围最大到127
这么说或许不太准确,应该说可以通过加减乘除计算的范围最大到127,超过了就会像超过整形最大值2^31-1那样出现负数等奇怪的数
我发现你已经做了如果a[i]大于122之后就让它减去26的判断
但是我们设想一下
n=25 a[i]为'z'时,他们加起来达到了147!
这个时候你再减去26已经无济于事了,因为已经不可运算了