当前位置: 首页 > news >正文

约瑟夫环(1+2)

n 个小孩围坐成一圈,并按顺时针编号为1,2,…,n,从编号为 p 的小孩顺时针依次报数,由1报到m ,当报到 m 时,该小孩从圈中出去,然后下一个再从1报数,当报到 m 时再出去。如此反复,直至所有的小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。

每行是用空格分开的三个整数,第一个是n,第二个是p,第三个是m (0 < m,n < 300)。最后一行是:0 0 0

#include<stdio.h>
void ysf(int n,int p,int m){
	int children[301];
	for(int i=1;i<=n;i++)
		children[i]=i;
	int index=p;//从编号为p的小孩开始
	int remaining=n;
	while(remaining>0){
		//数到m 
		for(int count=1;count<m;count++){
			index=(index%n)+1;
			while(children[index]==0)//跳过已经出圈的小孩 
				index=(index%n)+1;
		}
		printf("%d ",children[index]);
		children[index]=0;
		remaining--;
		//移动到下一个有效的小孩
		if(remaining>0){
			index=(index%n)+1;
			while(children[index]==0)
				index=(index%n)+1;
		} 
	} 
	printf("\n");
}
int main(){
	int n,p,m;
	while(1){
		scanf("%d %d %d",&n,&p,&m);
		if((n==0)&&(p==0)&&(m==0))
			break;
		ysf(n,p,m);
	}
	return 0;
}

 

编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。

下一个人继续从 1 开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

约瑟夫环

#include<stdio.h>
int ysf(int n,int m){
	int p=0;
	for(int i=2;i<=n;i++)
		p=(p+m)%i;
	return p+1;
}
int main(){
	int n,m;
	scanf("%d,%d",&n,&m);
	printf("%d",ysf(n,m));
	
	
	return 0;
} 

相关文章:

  • 【JVM】GC 常见问题
  • Python Cookbook-4.3 若列表中某元素存在则返回之
  • 机器学习之特征工程
  • 珠算与珠心算发展简介
  • c语言zixue
  • 并发编程面试题二
  • 从 root 一滴水看 Spring Data JPA 的汪洋大海
  • 前端面试笔试
  • 使用 Nginx 进行前端灰度发布的策略与实践
  • Day16:数组中出现次数超过一半的数字
  • harmonyOS NEXT开发与前端开发深度对比分析
  • C语言数据类型取值范围及格式化符号
  • NVMe集群:加速数据处理
  • 【C语言】自定义类型:结构体,联合,枚举(下)
  • python函数式编程
  • 【教程】继承中的访问控制 C++
  • C 语 言 --- 三 子 棋
  • 汽车保养记录用什么软件记录,汽车维修记录查询系统,佳易王汽车保养维护服务记录查询管理系统操作教程
  • 【免费】1949-2020年各省人均GDP数据
  • 2019年12月全国POI数据分享(同源历史POI分享系列)
  • 永辉超市回应顾客结算时被“反向抹零”:整改并补偿
  • 2025五一档首日电影票房破亿
  • 全国人大常委会关于授权国务院在中国(新疆)自由贸易试验区暂时调整适用《中华人民共和国种子法》有关规定的决定
  • 世界黄金协会:一季度全球黄金投资需求同比增170%
  • 关于新冠疫情防控与病毒溯源的中方行动和立场
  • 美国参议院投票通过戴维·珀杜出任美国驻华大使