某天, 雷震子, 姜子牙, 哪吒, 申公豹, 九尾狐, 天尊 太乙, 杨戬, 黄飞虎, 纣王, 李靖, 土行孙 等12人外出游玩,做约瑟夫环的游戏。12人围成一周,现在由任意一个人,从1开始报数,数到m的人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到所有的人全部出列。 出列完毕后,12人再按出列顺序从左到右排成一排。现在将12人分4为组。由最左侧人开始从1开始报数,数到4后,下一人重新从1开始报数,直到12人全部报数完毕。报数相同的人分为一组。 要求:1)编写算法,输入任何一个人的姓名和任意正整数m(m<=12),按顺序输出出列人的姓名。 并按出列顺序将出列人的姓名存入另外一个新建的队列。以“以天尊开始报数,数到5的人出列”为测试用例,测试结果。 2)编写分组算法,输出分组结果。 3)程序内容应该包含相应的文档说明(即注释,包括功能性注释和序言性注释)。程序要具有良好的可读性。c语言代码
时间: 2023-06-24 09:04:00 浏览: 309
用c语言编写约瑟夫环算法
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20 // 最大姓名长度
#define MAX_GROUP_NUM 4 // 最大分组数
#define MAX_PERSON_NUM 12 // 最大人数
typedef struct person {
char name[MAX_NAME_LEN]; // 姓名
int num; // 报数
int is_out; // 是否出列
} Person;
typedef struct queue {
Person* data[MAX_PERSON_NUM]; // 存储出列人员的队列
int front, rear; // 队头和队尾指针
} Queue;
// 初始化队列
void init_queue(Queue* q) {
q->front = q->rear = 0;
}
// 入队
void enqueue(Queue* q, Person* p) {
q->data[q->rear++] = p;
}
// 出队
Person* dequeue(Queue* q) {
return q->data[q->front++];
}
// 判断队列是否为空
int is_queue_empty(Queue* q) {
return q->front == q->rear;
}
// 报数游戏
void play_game(Person* persons[], int m, Queue* q) {
int count = 0, out_count = 0;
int i = 0, j = 0;
while (out_count < MAX_PERSON_NUM) {
if (!persons[i]->is_out) {
count++;
if (count == m) {
persons[i]->is_out = 1;
printf("%s ", persons[i]->name);
enqueue(q, persons[i]);
out_count++;
count = 0;
}
}
i = (i + 1) % MAX_PERSON_NUM;
}
}
// 分组
void divide_into_group(Person* persons[], int group_num) {
int i, j, k, count;
Person* group[MAX_GROUP_NUM][MAX_PERSON_NUM / MAX_GROUP_NUM];
memset(group, 0, sizeof(group));
count = 0;
for (i = 0; i < MAX_PERSON_NUM; i++) {
if (!persons[i]->is_out) {
group[count % group_num][count / group_num] = persons[i];
count++;
}
}
for (i = 0; i < group_num; i++) {
printf("Group %d: ", i + 1);
for (j = 0; group[i][j] != NULL; j++) {
printf("%s ", group[i][j]->name);
}
printf("\n");
}
}
int main() {
Person* persons[MAX_PERSON_NUM];
Queue q;
char test_name[MAX_NAME_LEN] = "天尊";
int test_m = 5;
int i;
init_queue(&q);
// 初始化人员信息
persons[0] = (Person*)malloc(sizeof(Person));
strcpy(persons[0]->name, "雷震子");
persons[0]->num = 1;
persons[0]->is_out = 0;
persons[1] = (Person*)malloc(sizeof(Person));
strcpy(persons[1]->name, "姜子牙");
persons[1]->num = 1;
persons[1]->is_out = 0;
persons[2] = (Person*)malloc(sizeof(Person));
strcpy(persons[2]->name, "哪吒");
persons[2]->num = 1;
persons[2]->is_out = 0;
persons[3] = (Person*)malloc(sizeof(Person));
strcpy(persons[3]->name, "申公豹");
persons[3]->num = 1;
persons[3]->is_out = 0;
persons[4] = (Person*)malloc(sizeof(Person));
strcpy(persons[4]->name, "九尾狐");
persons[4]->num = 1;
persons[4]->is_out = 0;
persons[5] = (Person*)malloc(sizeof(Person));
strcpy(persons[5]->name, "天尊");
persons[5]->num = 1;
persons[5]->is_out = 0;
persons[6] = (Person*)malloc(sizeof(Person));
strcpy(persons[6]->name, "太乙");
persons[6]->num = 1;
persons[6]->is_out = 0;
persons[7] = (Person*)malloc(sizeof(Person));
strcpy(persons[7]->name, "杨戬");
persons[7]->num = 1;
persons[7]->is_out = 0;
persons[8] = (Person*)malloc(sizeof(Person));
strcpy(persons[8]->name, "黄飞虎");
persons[8]->num = 1;
persons[8]->is_out = 0;
persons[9] = (Person*)malloc(sizeof(Person));
strcpy(persons[9]->name, "纣王");
persons[9]->num = 1;
persons[9]->is_out = 0;
persons[10] = (Person*)malloc(sizeof(Person));
strcpy(persons[10]->name, "李靖");
persons[10]->num = 1;
persons[10]->is_out = 0;
persons[11] = (Person*)malloc(sizeof(Person));
strcpy(persons[11]->name, "土行孙");
persons[11]->num = 1;
persons[11]->is_out = 0;
printf("出列顺序:");
play_game(persons, test_m, &q);
printf("\n");
printf("出列人员:");
while (!is_queue_empty(&q)) {
Person* p = dequeue(&q);
printf("%s ", p->name);
}
printf("\n");
divide_into_group(persons, MAX_GROUP_NUM);
// 释放内存
for (i = 0; i < MAX_PERSON_NUM; i++) {
free(persons[i]);
}
return 0;
}
```
阅读全文