求助!为啥这两个程序一个能过一个不能过呢?

P1914 小书童——凯撒密码

123456789qaz @ 2022-05-26 10:08:41

问一下各位大佬,这两个有什么区别?

为什么第一个过不了第二个能过?

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string a;
    int n;
    cin>>n;
    cin>>a;
    int l=a.length();
    char x; 
    for(int i=0;i<l;i++){
        x=a[i]+n;
        if(x>'z'){
            x=x-26;
        }
        cout<<x;
    }
    return 0;
} 
#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string a;
    int n;
    cin>>n;
    cin>>a;
    int l=a.length();
    char x; 
    for(int i=0;i<l;i++){
        if(a[i]+n>'z'){
            x=a[i]+n-26;
        }
        else{
            x=a[i]+n;
        }
        cout<<x;
    }
    return 0;
} 

by Bkorn_blume @ 2022-05-26 10:58:42

第一个里 如果移动位数超过Ascall码容量 就会使 x=a[i]+n;转化为未知字符 导致后续判断的转化x>'z'出现转化失败

但是第二个里a[i]+n>'z'直接是数值对比 解决了 x>'z'未知字符转数值的问题


by Bkorn_blume @ 2022-05-26 11:05:32

27 zz 晻 用1方法输入后得到晻 说明是Ascall越界了


by 123456789qaz @ 2022-05-26 11:16:47

@Yu_RenJay

谢谢大佬的指点!

也就是说ASCII码如果很大导致超过上限那么转化为数字就会失败,而第二种是直接比数字所以没有问题,我理解的对吗?

再次感谢您解开我的疑惑,谢谢


by Bkorn_blume @ 2022-05-26 14:38:32

@123456789qaz

有问题的程序:

x=a[i]+n;
    if(x>'z'){
        x=x-26;
    }

如你所思考的

z的ascall转化为122

而基础ascall码转化最大值不超过126

所以要考虑越界(不然要爆的)

x=a[i]+n;

强行这样的话为变成繁体或者其他乱码

等下判断凯撒会失败

输出出来也是乱码

希望对你有帮助


by 123456789qaz @ 2022-05-26 15:00:59

@Yu_RenJay

谢谢您的指点!

本蒟蒻幸得您的指点,已将此芝士收于囊中

再次谢谢您!


|