您的位置:首页 > 理论基础 > 数据结构算法

Coder Buct 1072: 数据结构作业(可选)-- 约瑟环问题

2014-08-06 10:49 351 查看


题目描述

将m个孩子从1到m编上号,按序号围坐成一个圈,从1号孩子开始数,每数到n时,被数到的孩子即离开圈子,然后从下一个孩子开始,再从1开始数,如此不断地数下去,只到只剩下最后一个孩子,问剩下的孩子是几号?


输入

输入为一组整数对,每个整数对占一行,整数对的第一个整数表示m,即孩子的个数,第二个整数表示n,即被数到n的孩子将离开。 0<m<10000, n>0 输入以0 0作为结束。


输出

每组整数对输出一个结果整数,每个输出占一行。 最后一行输入0 0不产生输出。


样例输入

8 35 20 0


样例输出

73

/*NO.1 (O(n) )算法*/

#include <stdio.h>
#include <math.h>

int main()
{
int m, r;
int i, j, s = 0;
scanf("%d %d",&m, &r);
for(i = 1; i <= m; i++)
s = (s + r) % i;
printf("%d\n",s + 1);
return 0 ;
}

/*NO.2 数组模拟*/

#include <stdio.h>
#include <stdlib.h>
#define MAX 10001

/*利用:求余特性,(i+1)%m...*/
int main()
{
int a[MAX] = {0} ;
int m, r, i, j, k, h;
scanf("%d%d",&m, &r) ;
k = 0;
for(i = 1; i <= m; i++){
for(j = 0 ; ; ){
if(a[k] == 0){
j++;
if(j < r)
k = (k + 1) % m;
else{
a[k] = 1;
printf("%d\n",k+1); /*输出正解*/
if(i != m)
k = (k + 1) % m;
break;
}
}
else
k = (k+1) % m ;
}
}
printf("%d\n",k+1) ;
return 0 ;
}

/*NO.3循环链表模拟*/

#include <stdio.h>
#include <stdlib.h>

typedef struct list
{
int num;
struct list *next;
}LIST;

int main()
{
LIST *head = NULL, *p, *q;
long i, j, k, m, r;
scanf("%ld%ld", &m, &r) ;
if(m <= 1){
printf("1");
return 0;
}
/*建立循环链表*/
p = (LIST *)malloc (sizeof(LIST));
p->num = 1;
p->next = NULL;
head = p;
q = p;
for(i = 2; i <= m; i++){
p = (LIST *)malloc (sizeof(LIST));
p->num = i;
p->next = NULL;
q->next = p;
q = p;
}
q->next = head ; /*将最后一个结点的指向头,这样就构成了循环链表*/
p = head ;
while (q->next != q){
for(i = 1; i < r; i++){
q = p;
p = p->next;
}
q->next = p->next ;
p = q->next ;
}
printf("%d\n", p->num);
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息