有没有大神帮我看看错误在哪儿?只得了80分

P1914 小书童——凯撒密码

晶锐离鸿 @ 2018-11-30 07:53:40

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]+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已经无济于事了,因为已经不可运算了

| 下一页