您的位置:首页 > 编程语言 > Java开发

约瑟夫环问题

2015-08-17 19:34 483 查看
<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报数
}
}
}
}




这是数组方式实现的。链表方式类似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息