#include <iostream>
using namespace std;
const int FIRST_SYMBOL = ' '; // первый символ
const int SYMBOL_NUMBER = 95; // для простоты кодируем только английский алфавит
void GammaCoding( string &input, string &gamma, string &result )
{
result.clear();
for( string::iterator i=input.begin(), j=gamma.begin(); i<input.end(); i++, j++ )
{
if(j==gamma.end()) j=gamma.begin();
int Ti = *i - FIRST_SYMBOL;
int Gi = *j - FIRST_SYMBOL;
result.push_back(FIRST_SYMBOL+(Ti+Gi)%SYMBOL_NUMBER);
}
}
void GammaDecoding( string &input, string &gamma, string &result )
{
result.clear();
for( string::iterator i=input.begin(), j=gamma.begin(); i<input.end(); i++, j++ )
{
if(j==gamma.end()) j=gamma.begin();
int Ci = *i - FIRST_SYMBOL;
int Gi = *j - FIRST_SYMBOL;
result.push_back(FIRST_SYMBOL+(Ci-Gi+SYMBOL_NUMBER)%SYMBOL_NUMBER);
}
}
int main()
{
setlocale(LC_ALL, "rus");
string str1, gamma, rez;
string str1_v, gamma_v, rez_v;
cout << "Введите исходное сообщение: ";
cin >> str1;
cout << "Введите гамму: ";
cin >> gamma;
GammaCoding( str1, gamma, rez );
cout << "Зашифрованное сообщение: ";
cout << rez << endl;
GammaDecoding( rez, gamma, str1 );
cout << "Проверка: ";
cout << str1 << endl;
system("pause");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNvbnN0IGludCBGSVJTVF9TWU1CT0wgPSAnICc7IC8vINC/0LXRgNCy0YvQuSDRgdC40LzQstC+0LsKY29uc3QgaW50IFNZTUJPTF9OVU1CRVIgPSA5NTsgLy8g0LTQu9GPINC/0YDQvtGB0YLQvtGC0Ysg0LrQvtC00LjRgNGD0LXQvCDRgtC+0LvRjNC60L4g0LDQvdCz0LvQuNC50YHQutC40Lkg0LDQu9GE0LDQstC40YIgCiAKdm9pZCBHYW1tYUNvZGluZyggc3RyaW5nICZpbnB1dCwgc3RyaW5nICZnYW1tYSwgc3RyaW5nICZyZXN1bHQgKQp7CiAgcmVzdWx0LmNsZWFyKCk7CiAgZm9yKCBzdHJpbmc6Oml0ZXJhdG9yIGk9aW5wdXQuYmVnaW4oKSwgaj1nYW1tYS5iZWdpbigpOyBpPGlucHV0LmVuZCgpOyBpKyssIGorKyApCiAgewogICAgaWYoaj09Z2FtbWEuZW5kKCkpIGo9Z2FtbWEuYmVnaW4oKTsKICAgIGludCBUaSA9ICppIC0gRklSU1RfU1lNQk9MOwogICAgaW50IEdpID0gKmogLSBGSVJTVF9TWU1CT0w7CiAgICByZXN1bHQucHVzaF9iYWNrKEZJUlNUX1NZTUJPTCsoVGkrR2kpJVNZTUJPTF9OVU1CRVIpOwogIH0KfQogCnZvaWQgR2FtbWFEZWNvZGluZyggc3RyaW5nICZpbnB1dCwgc3RyaW5nICZnYW1tYSwgc3RyaW5nICZyZXN1bHQgKQp7CiAgcmVzdWx0LmNsZWFyKCk7CiAgZm9yKCBzdHJpbmc6Oml0ZXJhdG9yIGk9aW5wdXQuYmVnaW4oKSwgaj1nYW1tYS5iZWdpbigpOyBpPGlucHV0LmVuZCgpOyBpKyssIGorKyApCiAgewogICAgaWYoaj09Z2FtbWEuZW5kKCkpIGo9Z2FtbWEuYmVnaW4oKTsKICAgIGludCBDaSA9ICppIC0gRklSU1RfU1lNQk9MOwogICAgaW50IEdpID0gKmogLSBGSVJTVF9TWU1CT0w7CiAgICByZXN1bHQucHVzaF9iYWNrKEZJUlNUX1NZTUJPTCsoQ2ktR2krU1lNQk9MX05VTUJFUiklU1lNQk9MX05VTUJFUik7CiAgfQp9CiAKaW50IG1haW4oKQp7CiAgICBzZXRsb2NhbGUoTENfQUxMLCAicnVzIik7CiAgICBzdHJpbmcgc3RyMSwgZ2FtbWEsIHJlejsKICAgIHN0cmluZyBzdHIxX3YsIGdhbW1hX3YsIHJlel92OwogICAgY291dCA8PCAi0JLQstC10LTQuNGC0LUg0LjRgdGF0L7QtNC90L7QtSDRgdC+0L7QsdGJ0LXQvdC40LU6ICI7CiAgICBjaW4gPj4gc3RyMTsKICAgIGNvdXQgPDwgItCS0LLQtdC00LjRgtC1INCz0LDQvNC80YM6ICI7CiAgICBjaW4gPj4gZ2FtbWE7CiAKICAgIEdhbW1hQ29kaW5nKCBzdHIxLCBnYW1tYSwgcmV6ICk7CiAgICBjb3V0IDw8ICLQl9Cw0YjQuNGE0YDQvtCy0LDQvdC90L7QtSDRgdC+0L7QsdGJ0LXQvdC40LU6ICI7CiAgICBjb3V0IDw8IHJleiA8PCBlbmRsOwogCiAgICBHYW1tYURlY29kaW5nKCByZXosIGdhbW1hLCBzdHIxICk7CiAgICBjb3V0IDw8ICLQn9GA0L7QstC10YDQutCwOiAiOwogICAgY291dCA8PCBzdHIxIDw8IGVuZGw7CiAKICAgIHN5c3RlbSgicGF1c2UiKTsKICAgIHJldHVybiAwOwp9