TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
C语言趣味程序百例精解之java实现:
71.约瑟夫问题

- public class Josephus {
- public static void main(String args[]){
- if(args.length != 3) //处理参数数目不正确情况
- {
- System.out.println("Please Input a number!");
- return;
- }
- int i, j, n, m,l;
- n = Integer.parseInt(args[0]);//总人数
- m = Integer.parseInt(args[1]);//每次报数到m
- l = Integer.parseInt(args[2]);//剩下l个人不死
- if (n <= 0 || m <= 0) //处理参数值不正确的情况
- {
- System.out.println("Paramter must bigger than zero!");
- return;
- }
- int a[] = new int[n];
- for (i = 0; i < n; i++)
- a[i] = i + 1;
- int k = 1; //标识处理第k个离开的人
- i = -1; //数组下标,下一个为0,即第一个人
- while (true) //k等于n表示只剩下一个人了
- {
- for (j = 0; j < m;) //在圈中数m个人
- {
- i = (i + 1) % n;
- if (a[i] >0) j++; //a[i] >0表示第i个人还没有离开
- }
- if(k==n-l+1) break;
- System.out.println("No." + a[i] + " is out!");
- a[i] = -1; //表示该人离开
- k++;
- }
- for(int t=0;t< n;t++){
- if(a[t]>0) System.out.println("No." + a[t] + " is alive!");
- }
- }
- }
复制代码 运行结果:
C:java>java Josephus 30 9 15
No.9 is out!
No.18 is out!
No.27 is out!
No.6 is out!
No.16 is out!
No.26 is out!
No.7 is out!
No.19 is out!
No.30 is out!
No.12 is out!
No.24 is out!
No.8 is out!
No.22 is out!
No.5 is out!
No.23 is out!
No.1 is alive!
No.2 is alive!
No.3 is alive!
No.4 is alive!
No.10 is alive!
No.11 is alive!
No.13 is alive!
No.14 is alive!
No.15 is alive!
No.17 is alive!
No.20 is alive!
No.21 is alive!
No.25 is alive!
No.28 is alive!
No.29 is alive! 或:- public class Test71{
- public static void main(String args[]){
- YueSeFu71();
- }
- /**
- * 71.约瑟夫问题
- */
- public static void YueSeFu71() {
- int max = 30;
- int[] people = new int[max];
- int n = 9;
- int idx = 0;
- for (int i = 0; i < max / 2 ; i++) {
- for (int j = 0; j < n;) {
- if (people[idx % max] == 0) {
- j++;
- }
- idx++;//
- }
- idx--;
- people[(idx) % max] = i + 1;
- }
- for (int i = 0; i < max; i++)
- System.out.print(people[i] + " ");
- //people[i]=0表示这人还活着,people[8]=1表示最先扔进大海,people[17]=2表示第二个扔入大海
- System.out.println();
- }
-
- }
- C:at>java Test71
- 0 0 0 0 14 4 7 12 1 0 0 10 0 0 0 5 0 2 8 0 0 13 15 11 0 6 3 0 0 9
- C:at>
复制代码
源码下载:http://file.javaxxz.com/2014/11/21/000510562.zip |
|