标签:
问题描述:
n个人编号为1~n,围成一个圈,从第一个人开始报数,123123。。。,报到3的人被踢出,如此循环,直到最后剩下一个人,请问这个人的编号是多少??
方法一:数组解法
import java.util.Scanner;
public class Joseph {
int[] arr;
Joseph(int e) {
arr = new int[e];
}
public static void main(String[] args) {
System.out.print("请输入人数: ");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Joseph j = new Joseph(num);
for(int i=1; i<=num; i++) {
j.arr[i-1] = i;
}
j.cal();
}
void cal() {
int count = 0;
int i = 0;
int sum = 0;
while(count != arr.length - 1) {
if(arr[i] != 0) {
sum++;
if(sum == 3) {
count ++;
arr[i] = 0;
sum = 0;
}
}
if(i == arr.length - 1) {
i = 0;
} else {
i++;
}
}
for(i=0; i<arr.length; i++) {
if(arr[i] != 0) {
System.out.println("幸存者是: " + arr[i] + "号");
}
}
}
}
方法二:循环单链表解法
import java.util.Scanner;
public class Joseph {
Node head;
Joseph(int e) {
head = new Node();
Node p = head;
for(int i=1; i<=e; i++) {
Node n = new Node(i);
p.next = n;
p = n;
}
p.next = head.next;
head = head.next;
}
void display() {
Node p = head;
while(p.next != head) {
System.out.print(p.data + "->");
p = p.next;
}
System.out.println(p.data);
}
public static void main(String[] args) {
System.out.print("请输入人数: ");
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
Joseph j = new Joseph(num);
j.display();
j.cal();
}
void cal() {
Node p = head;
int sum = 0;
while(p.next != p) {
sum++;
if(sum == 3) {
Node pre = pre(p);
System.out.println("删除 " + p.data + "号");
pre.next = pre.next.next;
sum = 0;
}
p = p.next;
}
System.out.println("幸存者是: " + p.data + "号");
}
Node pre(Node p) {
Node pre = p;;
while(pre.next != p) {
pre = pre.next;
}
return pre;
}
}
class Node {
int data;
Node next;
Node(){}
Node(int e) {
data = e;
}
}请输入人数: 9 1->2->3->4->5->6->7->8->9 删除 3号 删除 6号 删除 9号 删除 4号 删除 8号 删除 5号 删除 2号 删除 7号 幸存者是: 1号
标签:
原文地址:http://blog.csdn.net/qhairen/article/details/46458997