您的位置:首页 > 其它

约瑟夫环的问题

2015-09-19 19:36 267 查看
题目描述:设编号为1,2,3,4,5,6···········n(n>0)的n个人按顺时针方向围坐一圈,给定一个数m,从第一个人开始报数,报到m的那个人出列,不再参与报数,如此循环下去,直到只剩下最后一个人,求出最后一个人的编号。

解题思路:

这个题我采用的数组来做的。算法的描述:

(1)将数组中的n个元素置为1,完成初始化。

(2)初始设置变量m,j,k 。m表示数组中1的个数,即模拟剩下人的数目,m的初始值为n,k也是一个很重要的变量,是每一次循环遍历数组时用来计数那些人要被淘汰,j是用来查找要淘汰的人,每m长度之后,j的值就为0,i是用来循环遍历数组,用来循环查找未淘汰的人。

(3)这个过程主要是用了,一个大的循环,当剩下的人不是1的时候,一直在此循环内,每次循环的时候,要遍历数组,查找要淘汰的人,同时要计算剩下的人数。

代码:

#include"stdio.h"
#include"stdlib.h"
//按照我这么想的,时间复杂度应该是很大的吧
int Josephus(int a,int n)
{
int i=0,j,k,m;
int *b;
b=(int *)malloc(sizeof(int)*a);
for(i=0;i<a;i++)
b[i]=1;
k=0;
j=0;
m=a;//这是一个初始的值喔
while(m!=1) //还是有一个问题木有解决呢?注意这是一个循环的问题你
{
k=0;
i=0;
while(i<a)
{
if(b[i]==1)
{
j++;
if(j%n==0) //这个j表示很重要喔,模拟报数的时候的情景
{
b[i]=0;//表示吧这个给去掉了
k++;
j=0;
}
}
i++;
}//printf("一直在循环么\n");
m=m-k;
}
for(i=0;i<a;i++)//按照这种思路剩下的是值为1
if(b[i]==1)
{
return i+1;;//输出的是这个编号呢这才是编号
}
}
void main()
{
int a,b;
int i;
while(scanf("%d%d",&a,&b))
{
i=Josephus(a,b);
printf("剩下的人的编号%d\n",i);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: