80分求助,测试点4过不去。

P1914 小书童——凯撒密码

hxj555 @ 2022-01-05 22:41:03

#include<stdio.h>
int main(){
char a[51];int n,i,t;
scanf("%d",&n);  
scanf("%s",a);
for(i=0;a[i]!='\0';i++){
    if(n>=26)n=n%26;
    a[i]=a[i]+n;
    if(a[i]>122)
        a[i]=a[i]-26;

}printf("%s",a);
return 0;
}

by gling_myula @ 2022-01-05 23:25:47

翻了下之前的代码 我是等到它超过z就跳回a 你再试试


by gling_myula @ 2022-01-05 23:29:33

@hxj555


by hxj555 @ 2022-01-06 13:54:46

@haoyuan·Z 这个:if(a[i]>122) a[i]=a[i]-26; 这里就有,当它大于'z'就返回‘a’这个意思; 我也搞不懂为啥 当我输入的是12 z 输出的是奇奇怪怪的东西


by gling_myula @ 2022-01-06 19:57:05

我明白呀 我之前的代码是二重循环 你试以下在中间输出一下


by gling_myula @ 2022-01-06 20:14:00

@hxj555

#include<bits/stdc++.h>
using namespace std;
int main(){
    char a[51];int n,i,t;
    scanf("%d",&n);  
    scanf("%s",a);
    for(i=0;i<strlen(a);i++){
        if(n>=26)n=n%26;
        //你的代码在这加的输出的是-122(因为z这种快超限了,超限之后他就会往回倒
        if(a[i]+n>122)
            a[i]=a[i]-26+n;
        else a[i]=a[i]+n;
        cout<<a[i];
    }
    return 0;
}//这样就ac了

记得改改 以免棕名(我这个提交过了 下面是我之前的代码 可以看看

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    string s;//用字符串就行啦
    int n,i,j;
    cin>>n;
    cin>>s;
    for(i=0;i<s.size();i++)
    {
        for(j=1;j<=n;j++)//二重不会超时哒
        {
            s[i]++;
            if(s[i]>'z')//到z就返回a~
            s[i]='a';
        }
    }
    cout<<s;
    return 0;//完美ac
}//个人认为这种比较简洁好想 也不用背ascii码~~~

by hxj555 @ 2022-01-06 20:46:30

@haoyuan·Z 好哒好哒 谢谢啦。我今天也想到为啥会出现这个乱码了,当a[i]+n>127的时候 得考虑补码。所以,我改进了一下我的代码也通过拉


|