问题描述:编号为1,2,…… n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列顺序。
import java.util.Scanner;
public class JosepfuDemo {
public static void main(String[] args) {
JustGo();
}
public static void JustGo(){
Scanner scanner=new Scanner(System.in);
System.out.println("请输入小孩数量:");
int totalNum = scanner.nextInt();
System.out.println("请输入每一个小孩的密码值:");
int[] passwords=new int[totalNum];
for (int i = 0; i < totalNum; i++) {
int j=i+1;
System.out.println("请输入第"+j+"小孩的密码:");
int eachPassword = scanner.nextInt();
passwords[i]=eachPassword;
}
System.out.println("请输入开始数的值:");
int startCountNum = scanner.nextInt();
CircleSingleLinkedList circleSingleLinkedList=new CircleSingleLinkedList(totalNum);
circleSingleLinkedList.addEachPassword(passwords);
circleSingleLinkedList.CountChild(startCountNum);
}
}
class CircleSingleLinkedList{
private Child first=null;
private Child curChild=null;
private Integer ChildNums;
public CircleSingleLinkedList(int childNums) {
if (childNums<=0){
System.out.println("数据不正确");
return;
}
this.ChildNums = childNums;
for (int i = 1; i <= ChildNums; i++) {
Child child=new Child(i);
if (i==1){
first=child;
child.setNext(first);
curChild=first;
}else {
curChild.setNext(child);
child.setNext(first);
curChild=child;
}
}
}
public void ListAll(){
if (first==null){
System.out.println("没有任何小孩");
return;
}
Child curChild=first;
while (true){
System.out.println("小孩的编号"+curChild.getId());
if (curChild.getNext()==first){
break;
}
curChild=curChild.getNext();
}
}
public void addEachPassword(int[] passwords){
Child curChild=first;
for (int i = 0; i < this.ChildNums; i++) {
curChild.setPassword(passwords[i]);
curChild=curChild.getNext();
if (curChild==first){
break;
}
}
}
public void CountChild(int countStartNum){
int countNum=countStartNum;
if (this.ChildNums<=0){
System.out.println("参数有误");
return;
}
Child helper =first;
while(true){
if (helper.getNext()==first){
break;
} helper=helper.getNext();
}
while (true){
if (helper==first){break;}
for (int i = 0; i <countNum-1 ; i++) {
first=first.getNext();
helper=helper.getNext();
}
System.out.println("出圈小孩"+first.getId());countNum=first.getPassword();
first=first.getNext();
helper.setNext(first);
}
System.out.println("最后的节点"+first.getId());
}
}
class Child{
private Integer id;
private Integer password;
private Child next;
public Child() {
}
public Child(Integer id, Integer password) {
this.id = id;
this.password = password;
}
public Child(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
public Child getNext() {
return next;
}
public void setNext(Child next) {
this.next = next;
}
@Override
public String toString() {
return "Child{" +
"id=" + id +
'}';
}
}