用简单的c++语言编写程序利用约瑟夫环问题对一段英文内容进行加密与解密。 例如:I love China n=12,m=4,加密后为:oCaviln eh I 解密后为:Ilove China 【选做内容1]每个字母的m值不同。
时间: 2024-11-05 11:34:24 浏览: 16
用vector解决约瑟夫环.txt
约瑟夫环问题可以应用于简单的字母替换加密,我们可以通过一个模运算的方式实现每m个字符轮换一次。这里是一个简单的C++程序,它实现了加密和解密的功能,考虑到选做内容1,即每个字母的m值不同,我们可以创建一个映射表(map),存储每个字母对应的新的位置:
```cpp
#include <iostream>
#include <string>
#include <map>
std::map<char, int> letter_positions{'A':4, 'B':7, 'C':2, 'D':9, ...}; // 你可以添加更多的字母和对应的位置
std::string encrypt(const std::string& message, const int n, const std::vector<int>& m_values) {
std::string encrypted = "";
int position = 0;
for (char c : message) {
if (isalpha(c)) {
encrypted += static_cast<char>((letter_positions[c] + m_values[position]) % n);
} else {
encrypted += c;
}
position = (position + 1) % n;
}
return encrypted;
}
std::string decrypt(const std::string& encrypted, const int n, const std::vector<int>& m_values) {
std::string decrypted = "";
int inverse_m_values[n], inversed_sum = 0;
for (int i = 0; i < n; i++) {
inverse_m_values[i] = ((n - 1) % m_values[i]) + 1; // 根据欧几里得算法求逆元
inversed_sum += inverse_m_values[i];
}
int current_inverted_index = inversed_sum;
for (char c : encrypted) {
if (isalpha(c)) {
int original_pos = (current_inverted_index - letter_positions[c]) % n;
decrypted += static_cast<char>(original_pos == 0 ? 'A' : static_cast<char>(original_pos + 'A' - 1)); // 简化处理小写字母
} else {
decrypted += c;
}
current_inverted_index = (current_inverted_index + m_values[(current_inverted_index - 1) % n]) % n;
}
return decrypted;
}
int main() {
std::string message = "I love China";
int n = 12;
std::vector<int> m_values{4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5}; // 不同字母的m值
std::string encrypted = encrypt(message, n, m_values);
std::cout << "Encrypted: " << encrypted << "\n";
std::string decrypted = decrypt(encrypted, n, m_values);
std::cout << "Decrypted: " << decrypted << "\n";
return 0;
}
```
这个程序首先定义了一个字母到位置的映射表,然后通过加密函数和解密函数分别实现了加密和解密过程。注意,这里我们简化地处理了小写字母,如果你需要完整处理大小写,你需要额外处理。在这个示例中,你只需要填充 `letter_positions` 映射表即可开始加密和解密。
阅读全文