问题描述:
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号
时间: 2024-10-12 20:36:58