Насколько я знаю, "формула" Цезаря сдвига (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;
Спасибо!
A
иa
имеют гораздо больше смысла, чем65
и97
. - person molbdnilo   schedule 22.02.2019