测试点三和四没过,但是下载的数据测试点三偏移26,是原样输出的

P1914 小书童——凯撒密码

Answerexploer @ 2024-03-11 19:44:09

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

by Answerexploer @ 2024-03-11 19:55:58

ASCII码最大是127,但是如果越界了再减26行吗,测试点的数据显示是一样的,但是用vscode跑是会出现中文乱码。


by wyxrl @ 2024-03-11 20:12:37

@Answerexploer 你为啥要多一个字符数组?用字符串操作应该会对

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

by Answerexploer @ 2024-03-12 09:50:37

@wyxrl 啊,我只用了字符串吧,用[]是为了访问字符串中的每一个元素。


by wyxrl @ 2024-03-12 20:29:41

@Answerexploer 那你的 char a[str.size()];是啥。


by Answerexploer @ 2024-03-13 18:58:03

@wyxrl 但是对一个字符串怎么移位操作,都需要拆开成一个字符处理吧。所以这个字符数组应该不是主要矛盾吧。


by wyxrl @ 2024-03-13 19:29:40

@Answerexploer 本蒟蒻又找得到这个了,亲测60变80,要加特判(虽然我不知道为什么)

if(n==26)
    {
        cout<<str;
        return 0;
    }

by Answerexploer @ 2024-03-13 20:04:04

@wyxrl 这个就是测试点三,第三个测试点偏移量是26,你的特判正好通过了,避免了加n后的中文乱码,我感觉应该还是要提防越界吧,可能越界了char表示的数字就乱了?别想了,我早就用模26去了。


by xhl_leo @ 2024-04-03 16:40:25


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

by xhl_leo @ 2024-04-03 16:42:11

求个关注


|