题目描述
100 个人围成一圈,每个人有一个编码,编号从 1 开始到 100。他们从 1 开始依次报数,报到为 M 的人自动退出圈圈,然后下一个人接着从 1 开始报数,直到剩余的人数小于 M。请问最后剩余的人在原先的编号为多少?
输入描述
输入一个整数参数 M
输出描述
输出描述:如果输入参数 M 小于等于 1 或者大于等于 100,输出“ERROR!”;否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串
示例1
3
58,91
说明:输入M为3,最后剩下两个人。
示例2
4
34,45,97
说明:输入M为4,最后剩下三个人
public static void main(String[] args) {
Demo21 test4 = new Demo21();
Node tmpHeader=test4.genedList();
for (int i = 2; i <= 100; i++) {
test4.insertList(tmpHeader, i);
}
Node itr = tmpHeader;
do{
System.out.print(itr.data+" ");
itr=itr.rightNext;
}while(itr != tmpHeader);
System.out.println();
System.out.print("m=");
Scanner scan = new Scanner(System.in);
int m = scan.nextInt();
Node front=tmpHeader;
while(test4.count(tmpHeader) >= m){
for (int i = 1; i < m; i++) {
tmpHeader=tmpHeader.rightNext;
}
tmpHeader.leftNext.rightNext = tmpHeader.rightNext;
tmpHeader.rightNext.leftNext = tmpHeader.leftNext;
tmpHeader = tmpHeader.rightNext;
}
Node itr1 = tmpHeader;
while(itr1.data > itr1.leftNext.data){
tmpHeader = itr1 = itr1.leftNext;
}
do{
System.out.print(itr1.data+" ");
itr1=itr1.rightNext;
}while(itr1 != tmpHeader);
}
private int count(Node top){
Node p=top;
int total=0;
do{
++total;
}while((p=p.rightNext) != top);
return total;
}
private Node genedList(){
Node top=new Node(1);
top.leftNext = null;
top.rightNext = null;
return top;
}
private boolean insertList(Node tmpHeader,int ele){
Node p=tmpHeader;
Node q=tmpHeader;
while(p.rightNext !=q && p.rightNext != null){
p=p.rightNext;
}
Node newP=new Node(ele);
newP.data=ele;
p.rightNext = newP;
newP.leftNext = p;
q.leftNext = newP;
newP.rightNext = q;
return true;
}
private class Node{
private Node leftNext;
private Node rightNext;
private int data;
public Node(int data){
this.data=data;
}
}