约瑟夫环

已知有n个人(以编号1,2,3…n表示)围坐在一张圆桌上。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,圆桌上只剩一个人。

#include<stdio.h>
int flag[450000]={0},sum=0;
int fun(int a,int b)
{
 	int i,num;
 	num=0;
 	for(i=1;i<=a;i++)
 	{
  		if(flag[i]==0)
   			num++;
 	}
 	if(n==1)
  		for(i=1;i<=a;i++) 
   			if(flag[i]==0)  
    				return i;
 	for(i=1;i<=a;i++)
 	{
  		if(flag[i]==0)
  		{
   			sum++;
   			if(sum%b==0)
    				flag[i]=1;
  		} 
 	}
 	fun(a,b);
}
int main()
{
 	int n,m,ans;
 	scanf("%d%d",&n,&m);
 	ans=fun(n,m);
 	printf("%d",ans);
 	return 0;
}

解题思路:
首先定义一个flag数组,然后全部赋初值为0;
在进入函数之前n个人的记录都为0;
函数中num用来计算还有多少个人的记录为0,每次进入函数体中都要先将num初始化为0;
函数中的第一步是遍历这个flag的数组,如果遇到flag的值为0,则令负责计数的num++,
如果num的值为1时,说明圆桌上所有人中只有一个人的记录为0,那么他就是最后剩下的这个人,返回他的下标
如果num的值不为1,说明圆桌上还不止一个人,那么进入循环,sum用来计数,每次当它能除尽m这个数时,就说明此时这个人报数的值是m,因为sum是m的倍数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值