约瑟夫问题新解,可以按照需求进行修改任意数字

Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓。于是决定了自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀。然后下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

如果是其他数数规则,只要修改相应的A,B,C,D即可,A为第几个人需要出列,B为总共有多少个人,C为剩下多少人。D为是不是第一个先出,即0、1、2、3,是否先排除0,然后再隔着排除

#include <stdio.h>
#define A 3  
#define B 41  
#define C 2 
#define D 0
//宏定义,A为排第几个出来,B为总人数,C为剩下的人数,D为当A为2时候先出还是后出补丁,按正常数数 修改为0即可
int main()
{
   int a,i,b[B],c;
	a = D;
	c = 0;
//将数字排序
	for(i=0;i<B;i++)
	{
		b[i] = i+1;
		printf("%d\t",b[i]);
	}
	printf("\n");

//去除满足数到的数字	
	for(i=0;c!=(B-C);i++)
	{
		if(i==B)
		{
			i = 0;

		}

		if(b[i]!=0) 
		{a++;printf("\n i=%d,a=%d,",i,a);}

		if(a==A && b[i]!=0)
		{
			printf("delect %d\t",b[i]);
			b[i] = 0;
			a = 0;
			c ++;
			printf("c=%d\n",c);
		}

	}
	
//打印最后面不为0的数字
	for(i=0;i<B;i++)
	{
		if(b[i]!=0)
			printf("\n 最后剩下来的是 %d",b[i]);
	}

   
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值