1275 - C语言11.11
时间限制 : 1 秒
内存限制 : 32 MB
有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。要求用循环链表实现。
题目输入
只有一个正整数n,保证n不超过1000。
题目输出
输出最后留下的人的原始编号。
请注意行尾输出换行。
输入/输出样例
输入格式
10
输出格式
4
C语言解答
#include <stdio.h> main() { int n, m=3, i, s=0; scanf("%d", &n); for (i=2; i<=n; i++) s=(s+m)%i; printf ("%d\n", s+1); }
C++解答
#include <stdio.h> #include <stdlib.h> struct node { int num; struct node * next; }; int main() { struct node *p, *head, *current; int n, i; scanf("%d", &n); /* 建立循环链表 */ head = current = NULL; for (i = 0;i < n;i++) { p = (struct node *)malloc(sizeof(struct node)); p->num = i + 1; if (head == NULL) { head = current = p; } else { current->next = p; current = p; } } current->next = head; /* 模拟前n-1个人报号退出圈子的过程 */ current = head; for (i = 0;i < n - 1;i++) { current = current->next; p = current->next; current->next = p->next; current = current->next; free(p); } printf("%d\n", current->num); return 0; }