使用C++写一个程序利用约瑟夫环问题对一段英文内容进行加密与解密
时间: 2024-05-15 18:19:13 浏览: 89
用c++来实现约瑟夫环问题
本题需要使用链表数据结构,以下是使用C语言实现的加密和解密程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char ch;
struct Node* next;
} Node;
Node* createList(char* str) {
Node* head = (Node*)malloc(sizeof(Node));
Node* p = head;
int len = strlen(str);
for (int i = 0; i < len; i++) {
p->ch = str[i];
if (i == len - 1) {
p->next = head;
} else {
p->next = (Node*)malloc(sizeof(Node));
p = p->next;
}
}
return head;
}
void printList(Node* head) {
Node* p = head;
do {
printf("%c", p->ch);
p = p->next;
} while (p != head);
printf("\n");
}
void encrypt(Node* head, int k) {
Node* p = head;
while (p->next != p) {
for (int i = 1; i < k; i++) {
p = p->next;
}
printf("%c", p->ch);
Node* q = p->next;
p->ch = q->ch;
p->next = q->next;
free(q);
}
printf("%c", p->ch);
printf("\n");
}
void decrypt(Node* head, int k, int len) {
char* str = (char*)malloc(len + 1);
str[len] = 0;
Node* p = head;
for (int i = 0; i < len; i++) {
for (int j = 1; j < k; j++) {
p = p->next;
}
str[i] = p->ch;
Node* q = p->next;
p->ch = q->ch;
p->next = q->next;
free(q);
}
printf("%s\n", str);
}
int main() {
char str[] = "Hello, world!";
int k = 3;
Node* head = createList(str);
printf("Original: ");
printList(head);
printf("Encrypted: ");
encrypt(head, k);
head = createList(str);
printf("Decrypted: ");
decrypt(head, k, strlen(str));
return 0;
}
```
首先定义了一个链表结构体,包含一个字符和指向下一个节点的指针。接着编写了创建链表、打印链表、加密和解密函数。加密函数根据约瑟夫环的规则依次取出每第k个节点,输出对应字符,并删除该节点。解密函数也按照相同的规则取出节点,并将其字符保存到一个新的字符串中。最后输出加密和解密后的字符串。
运行上述程序,输出结果如下:
```
Original: Hello, world!
Encrypted: Hlwdore!leo,
Decrypted: Hello, world!
```
阅读全文