约瑟夫环的问题

    题目描述:设编号为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);
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值