约瑟夫环问题

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">最近在做一些笔试题,总结一下,常遇到的算法问题。</span>
经典的约瑟夫环问题:现在一共有N个人围成一圈,从第一个开始报数,报到M的人出列,下个人从1开始报,打印所有人的出圈的顺序。

为了与数组的下表对应,我们将其简化一下:从0开始到N-1个个人,报出M-1的人出列,下一个人从0开始报。  给最终结果+1就可以得到原编号。

import java.util.Scanner;
public class  YsfTest {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入总人数:");
		int sum = sc.nextInt();
		System.out.println();
		System.out.print("请输入出圈序号:");
		int m = sc.nextInt();
		System.out.println();
		int[] arr = new int[sum];
		int count = 0;  	//用来统计出圈人数
		//初始化数组,0表示出圈 1表示在圈内
		for(int i=0; i<sum; i++){
			arr[i] = 1;
		
		}
		System.out.print("出圈序列:");
		for(int i=0,j=0;  i<sum; i = (i+1)%sum) {
			if(arr[i]!=0){    		//当前元素还在圈里时才进行报数,否则直接遍历数组下一个元素,直到找到下一个仍然在圈里的元素
				if(j==(m-1)){    	//当报数为指定的m-1时出列(因为下表是从0开始),并且J变为-1。等于下一个人报的是0
					arr[i] = 0;
					System.out.print(i+1);
					j = -1;
				    count++;  //出圈人数+1
					if(count==sum){        //当出圈人数为sum时,结束
						break;
					}
				}
				j++;//    利用J来确定报数,第一次第一个人报数就是j=0,所以每次应该是先检查报数,然后在+1报数
			}
		}
	}
}


 这是数组方式实现的。链表方式类似。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值