-
题目描述:
-
N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。
请按退出顺序输出每个退出人的原序号。
-
输入:
-
包括一个整数N(1<=N<=3000)及一个整数p。
-
输出:
-
测试数据可能有多组,对于每一组数据,
按退出顺序输出每个退出人的原序号。
-
样例输入:
-
7 3
-
样例输出:
-
3 6 2 7 5 1 4
-
#include <stdio.h> #include <stdlib.h> #define MAX 3005 int buff[MAX], n; int is_true() { int i, is_true = 0; for(i = 1; i <= n; i++) { if(buff[i] == 1) { is_true++; break; } } if(is_true == 1) { return 1; } return 0; } int main() { int k, p, i, cnt, res[MAX], j; while(scanf("%d%d", &n, &p) != EOF) { for(i = 1; i <= n; i++) { buff[i] = 1; } j = 1; k = 0; while(is_true() == 1) { cnt = 0; while(cnt < p) { if(buff[j] == 1) { cnt++; } j++; if(j == n + 1) { j = 1; } } if(j == 1) { for(i = n; i >= 1; i--) { if(buff[i] == 1) { buff[i] = 0; res[k++] = i; break; } } } else { buff[j - 1] = 0; res[k++] = j - 1; } } for(i = 0; i < k - 1; i++) { printf("%d ", res[i]); } printf("%d\n", res[k - 1]); } return 0; }
//生成一个长度为21的数组,依次存入1到21;建立一个长度为21的单向链表,
//将上述数组中的数字依次存入链表每个结点中;将上述链表变为单向封闭(循环)链表;
//从头结点开始数,将第17个结点删除,将它的下一个结点作为新的头结点;
//重复上述过程,直到该链表中只剩一个结点,显示该结点中存入的数字。
-
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node *next; }Node; int main() { Node *Link, *tmp, *head, *d; Link = (Node *)malloc(sizeof(Node)); int i; head = Link; tmp = (Node *)malloc(sizeof(Node)); tmp->data = 1; tmp->next = NULL; head = Link = tmp; for(i = 2; i <= 21; i++) { tmp = (Node *)malloc(sizeof(Node)); tmp->data = i; tmp->next = NULL; head->next = tmp; head = tmp; } head->next = Link; tmp = Link; int cnt = 21; while(cnt > 1) { for(i = 1; i <= 16; i++) { tmp = tmp->next; head = head->next; } d = head->next; head->next = head->next->next; printf("%d\n", d->data); tmp = tmp->next; free(d); cnt--; } if(head->next == head) { printf("%d\n", head->data); } return 0; }