1275 - C语言11.11

通过次数

0

提交次数

0

时间限制 : 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;
}