The Second Blog -数组实现约瑟夫问题-C语言

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define    N    100    // 总人数
#define    M    7   // 数数周期   每数M个就要淘汰一个
int main()
{
	

	int num[N];
	int index;
	for (index=0; index<N; ++index)  //初始化进行编号
	{
		num[index] = index+1;
	}
	int count=N;//未被淘汰人数
	int mod=0;    //计数器,记到周期数就淘汰
	index=0;
	while(count>1)
	{
		if(num[index]!=0)  //此人未被淘汰
		{
			mod++;
			if(mod==M)
			{
				num[index]=0; //淘汰此人
				mod=0; //重置计数器
				count--; //总人数减一
			}                    //数到3个人  变回零
			index=(index+1)%N; //构成循环
		}
		else
		{
			index=(index+1)%N;
		}
	}
	for(index=0;index<N;++index)
	{
		if(num[index]!=0)
			printf("胜出者为%d",num[index]);
	}

	system("pause");
	return 0;
}




//强制转换跳转方式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define    N    100    // 总人数
#define    M    7  // 数数周期   每数M个就要淘汰一个
int main()
{
	int str[N];
	int i,count,mod; //下标,剩余人数,计数
	for (i=0;i<N;++i)//初始化
	{
		str[i]=i+1;
	}
	count=N;
	mod=0;
	i=0;
	while(count>1)
	{
		if (str[i]!=0)
		{
			mod++;
			if(mod==M)//表示达到一个循环,此时应该淘汰此人,计数器清零
			{
				str[i]=0;
				mod=0;
				count--;
			}
		if (i==N-1)//如果 下标为9表示最后一个人  下一个人就强制跳转到1
			i=0;
		else
			i++;//否则 下标++
		}
		else if(i==N-1)//如果下标为9是数组内容为0,则强制跳转到1
			i=0;//
		else
			i++;//否则下标++
	}
	for(i=0;i<N;++i)
	{
		if (str[i]!=0)
		{
		   printf(" the winner is %d \n",str[i]);
		}
	}



约瑟夫问题重点:

1.计数,每数M个人 就要淘汰一个人,所以要有一个计数器Mod

2.对于淘汰的人,要将数组的值赋为零,并且在下次报数经过时,直接跳过数组内容为0的数组

3.实现数组的循环访问,一种方法是通过取余,另一种方法强制在数组尾部,使数组下标重新回到头部

最好的方法应该是链表实现的 ,等学到那一部分,再进行实现。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值