约瑟夫圆环问题

  • 现有n个人坐在一个桌前,从node开始数,数m个数,数到的那个人被杀死。接着跳过死掉的人往后数,直到只剩一个人为止。

代码如下:

#include <stdio.h>
//#include<malloc.h>
//#include <stdlib.h>
int main(){
	//int  *person,i,node,n,m;
	//int count=0;//记死亡总数 
	int  node,n,m;//n是总数,m是循环计数值 
	scanf("%d%d",&n,&m);
	int person[n];
	//person=(int*)malloc(sizeof(int)*(n+1));
	for(int i=1;i<n;i++){//初始化圈
		person[i]=i+1;//i表示编号为i的人,person[i]的值表示编号为i的人的下一个人的编号
	}
	//让数组循环起来 
	person[n]=1;//编号为n的下一个人的编号是1
	node=1;
	while(node!=person[node]){//如果某个人的下一个人不是自己,意味着人数超过1人
		for(int i=1;i<m-1;i++){//这个循环终止于被杀的人的前一个人
			node=person[node];//下一个人的编号为node,node的值来自于前一个人的person[node]
		}
		//count++;
	printf("%d ",person[node]);//输出被杀的人编号
	person[node]=person[person[node]];//下一个人替换掉被杀的人 
	node=person[node];//这句话中的node指向下一个开始计数的person 
	}
//	int rest=n-count;
//	printf("\n");
//	printf("killed number:%d\n",count);
//	printf("lived number:%d",rest);
	printf("\n");
	printf("%d",node);//输出最后幸存者的编号
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值