约瑟夫环,3改成m即可

 

 

#include<stdio.h>
int main()
{
	int people[1000] = { 0 };//赋值为一
	int n;
	scanf("%d", &n);
	int all = n;//all记录现存的人数
	int u = -1, i;//u代表编号,因为首项必为第三人(编号u=2),所以此时u=-1,原因看完就懂了
	while (1)
	{// 一些测试案例...2  2+2=1  1 //1 2 3 4  3 , 2+2=4=0 2 //1 2  3 4   1 2 4   
		//1 2 3 4   1 2 4    1 4  1//   1 2 3  1 2   2
		for (i = 1; i <= 3; i++)//注意i指的是步长,这点也是难我好长时间的一点
		{//三个有意义的步使一个人出局
			// 研究与这些变量的变化,嘻嘻:printf("\n{u=%d people[u]=%d i=%d\n", u ,people[u],i);
			if (people[u] == 0 && i == 3)
			{
				people[u] = -1;
				all--; u++;//下一次开始时从下一个人开始计数
				u = u % n;//防止溢出 使u的值限定在0,1 ,2,..,n-1
				break;
			}
			if (people[u] != 0)
				i--;//已经出局的人去减少步数
			u++;
			u = u % n;
		}
		if (all == 1)//只剩一个人就跳出
			break;
	}
	int m = 0;//利用m,就算编号为0的人存活(第一个人)也能方便的输出
	for (int k = 0; k < n; k++)
	{
		m++;
		if (people[k] == 0) printf("%d", m);//遍历所有的人,从编号来检查每个人是否存活
	}
	return 0;
}

 

 不怎么抽象,就是我总绕晕吧,开始没有考虑步长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值