约瑟夫环问题
1.已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。(也类似于变态杀人狂问题)通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。通常,我们会要求输出最后一位出列的人的序号。那么这里主要研究的是最后一个出列的人的序号要怎么确定。
int main()
{
int n, m, i, num= 0;
scanf("%d%d", &n, &m);
for (i = 2; i <= n; i++)
{
num = (num + m) % i;
printf("%d\n",num);
}
printf ("%d", num+1);
}
2.要从n只猴子中选出一位大王。它们决定使用下面的方法:
n只猴子围成一圈,从1到n顺序编号。从第q只猴子开始,从1到m报数,凡报到m的猴子退出竞选,下一次又从退出的那只猴子的下一只开始从1到m报数,直至剩下的最后一只为大王。请问最后哪只猴子被选为大王。
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <ctype.h>
int main()
{
int n,m,q;
int i;
scanf("%d%d%d",&n,&m,&q);
int num=0;
for(i=2;i<=n;i++)
{
num=(num+m)%i;
}
printf("%d",(num+q)%n);
//原本是num+1 因为从第q个也即下标为q-1开始算 所以应该是num+1+q-1 最后别忘了%n
return 0 ;
}