约瑟夫环问题(java实现)

本文介绍了一种解决约瑟夫环问题的方法,通过数组记录每个人的状态,利用循环和计数实现了报数过程,最终找到了最后一个留在圆圈中的人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
   已知n个人围坐在一张圆桌周围,从编号为start的人开始报数,数到k的那个人出列;他的下一个人又从1开始报数,数到k的那个人又出列;依此规律重复下去,直到圆桌只剩下一个人。

思路:

  • 用数组a表示这n个人,对应的下标为0~n-1,用0表示未出列,1表示已出列
  • 用count记录数到的数,当数到k时此人的对应位置置为1,表示已出列
  • start记录每次开始报数的位置,因为n-1的下一个位置是0,所以start = (start+1)%10
  • 最后当只剩下一个人时,输出值为0的人

实现:

import java.util.Scanner;

public class JosephRing {

	public static void main(String[] argstart) {
		// TODO Auto-generated method stub
		Scanner reader = new Scanner(System.in);
		int k = reader.nextInt();   //间隔
		int n = reader.nextInt();      //人数
		int start = reader.nextInt();    //开始位置
		start = start%n;                //保证n落在人数范围内
		int count =0;              //每数一次,count+1
		int a[] = new int [n];
		while(n > 1)            //只剩一个人时退出循环
		{
			if(a[start]==0)
			{
				count++;
				if(count%k==0)    //数到k时这个人出列,位置标记为1,总人数-1
				{
					a[start]=1;
					n--;
				}
			}
			start = (start+1)%10;    //如数到10时对应位置应是a[0]
		}
		for(int i=0;i<10;i++)
		{
			if(a[i]==0)         //最后剩下的人a[]=0
			{
				System.out.println(i);  
				break;
			}
		}		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值