Как я знаю, "формула" Смещения Цезаря - это (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;
}
Позвольте мне записать случай, который мне не удалось запустить.
input:
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;
Спасибо!