凯撒密码:如何计算移动值> 10(或更大)?

问题描述 投票:0回答:1

据我所知,Caesar Shifting的“公式”是(x + k)%26,其中k是移位值,解密只是将“+”替换为“ - ”。

但是当k> 10时我的代码不起作用(在我测试k = 10之后,我发现前几个字符的“移位”是错误的,所以我估计k> 10将是错误的(不正确字符的数量增加) )以及。)。我首先将字符更改为ASCII然后进行计算。最后将其改回字符。

这是我的代码。

#include <iostream>
#include <string>
using namespace std;
int main() {
    string target;
    char s;
    int k, i, num, length, j;
    cin >> s >> k;
    getline(cin, target);

    for (j = 0; j <= (int)target.length(); j++) {
        if ((target[j]) = ' ') {
            target.erase(j, 1);
        }
    }

    length = (int)target.length();

    if (s == 'e') {
        for (num = 0; num <= length; num++) {

            if (isupper(target[num]))
                target[num] = tolower(char(int(target[num] + k - 65) % 26 + 65));
            else if (islower(target[num]))
                target[num] = toupper(char(int(target[num] + k - 97) % 26 + 97));
        }
    }
    else if (s == 'd') {
        for (num = 0; num <= length; num++) {
            if (isupper(target[num]))
                target[num] = tolower(char(int(target[num] - k - 65) % 26 + 65));
            else if (islower(target[num]))
                target[num] = toupper(char(int(target[num] - k - 97) % 26 + 97));
            }
        }
    cout << target;
    return 0;
}

让我说一下我没能跑的情况。

输入:

d 10 n 3 V 3 D 3 N _ M Y N 3 _ S C _ N 3 L E(首先输入d / e,然后移动值,最后字符串序列需要“更改”,空格需要删除。)

预期产量:

D3l3t3d_cod3_is_d3bu

我的输出:

D3l3:3d_cod3_i9_d3b;谢谢!

c++ ascii caesar-cipher
1个回答
2
投票

您的问题是,解码时最终会出现负数。使用k == 13,表达式'T' - k - 65给出了-7-7 % 26仍然是-7-7+6558,不是一封信。

您可以通过在解码时将k设置为26 - k来避免负数。

您的代码然后简化为:

if (s == 'd') {
    k = 26 - k;
}
for (num = 0; num <= length; num++) {

    if (isupper(target[num]))
        target[num] = tolower(char(int(target[num] + k - 'A') % 26 + 'A'));
    else if (islower(target[num]))
        target[num] = toupper(char(int(target[num] + k - 'a') % 26 + 'a'));
}

注意我已经用它们的等效字符替换了你的整数常量,这使得代码更容易理解。请注意,你的第一个循环中也有一个错误(target[j]) = ' '应该是(target[j]) == ' '

使用所有c ++必须提供的代码可以减少代码:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string target = "mXLM";
    char s = 'e';
    int k = 7;

    target.erase(std::remove(target.begin(), target.end(), ' '), target.end());

    if (s == 'd') {
        k = 26 - k;
    }
    std::string result;
    std::transform(target.begin(), target.end(), std::back_inserter(result), [k](char in) {
        if (isalpha(in)) {
            char inputOffset = isupper(in) ? 'A' : 'a';
            char outputOffset = isupper(in) ? 'a' : 'A';
            return char(int(in + k - inputOffset) % 26 + outputOffset);
        }
        return in;
    });
    std::cout << result;
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.