60分求助,悬赏1关

P1914 小书童——凯撒密码

Wyttie @ 2023-08-09 11:07:22

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    string s;
    cin>>n>>s;
    for(int i=0;i<s.length();i++){
        s[i]+=n;
        if(s[i]>'z'){
            s[i]-=26;
        }
    }
    cout<<s;
    return 0;
}

by XZX528 @ 2023-08-09 11:16:04

不要用string,否则可能会出现中文乱码。

提供一组测试数据:

测试点三:

输入:

26
qwertyuiopasdfghjklzxcvbnm

输出:

qwertyuiopasdfghjklzxcvbnm

by XZX528 @ 2023-08-09 11:18:50

用char类型的数组就可以了@Wyttie


by Wyttie @ 2023-08-09 11:21:19

@XZX528 谢谢,已关


by jackcm @ 2023-08-09 11:25:13

你移位操作时没有考虑到超过字母表末尾的情况。 当n的值等于26时, 将每个字符的ASCII值增加26后, 会超出小写字母的范围。

(可以使用模运算来确保字符的ASCII值始终在合法的字母范围内) (或者直接把循环替换成这样双重循环(比较笨) ```cpp for(j=1;j<=n;++j){ s[i]++; if(s[i]>'z')s[i]='a'; } ``` )

by jackcm @ 2023-08-09 11:26:14

@XZX528 好像也不错


by Wyttie @ 2023-08-09 11:41:53

@XZX528 qwq我改了却还是过不了

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    string s;
    char a[51];
    cin>>n>>s;
    for(int i=0;i<s.length();i++){
        a[i]=(char)s[i];
        a[i]=(char)a[i]+n;
        if(a[i]>'z'){
            a[i]=(char)a[i]-26;
        }
    }
    for(int i=0;i<s.length();i++){
        cout<<(char)a[i];
    }
    return 0;
}

by XZX528 @ 2023-08-09 11:59:26

@Wyttie

#include<iostream>
using namespace std;
char s[55];
int main(){
    int n;
    cin>>n>>s;
    for(int i=0;s[i]!='\0';i++){
        s[i]=(s[i]-'a'+n)%26+'a';
    }
    for(int i=0;s[i]!='\0';i++){
        cout<<s[i];
    }
    return 0;
}

by XZX528 @ 2023-08-09 12:02:31

从一开始就不要用string了呗,五十以内的字符数,直接用char数组就可以了┐( ̄ヘ ̄)┌


by Wyttie @ 2023-08-10 09:06:06

@XZX528 懂了,谢谢大佬


|