游客 Signup | Login
中文 | En

1275 - C语言11.11

有n个人围成一圈,顺序从1开始排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。要求用循环链表实现。

Input

只有一个正整数n,保证n不超过1000。

Output

输出最后留下的人的原始编号。

请注意行尾输出换行。

Examples

Input

10

Output

4

Solution 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);
}

Solution 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;
}

Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题