题目描述
n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。)
输入
第一行为人数n; 第二行为报数k。输出
输出最后胜利者的标号数。样例输入
10 4样例输出
5#include<stdio.h> #include<string.h> #include<math.h> #include<malloc.h> #define INF 0x3f3f3f3f #define MAX(x,y) (x>y?x:y) #define MIN(x,y) (x>y?y:x) #define M 1000 typedef struct LNode { int data; struct LNode* next; }LNode; LNode* InitLNode(int n) { LNode* head = (LNode*)malloc(sizeof(LNode)); head->data = 1; head->next = NULL; LNode* p = head; for (int i = 2; i <= n; i++) { LNode* s = (LNode*)malloc(sizeof(LNode)); s->data = i; s->next = NULL; p->next = s; p = s; } p->next = head; return head; } void findLNode(LNode* head, int k) { LNode* p = head; LNode* temp = head; while (p->next != p) { for (int i = 1; i < k; i++) { temp = p; p = p->next; } temp->next = p->next; free(p); p = temp->next; } printf("%d\n", p->data); } int main() { int n; scanf("%d", &n); LNode* head; head = InitLNode(n); int k; scanf("%d", &k); findLNode(head, k); return 0; }
SWUST OJ956: 约瑟夫问题的实现
最新推荐文章于 2023-03-25 12:41:42 发布