熟三退一的小程序大家都清楚吧,我现在有算法,但是程序不知道怎么编比较好,比如5个数组,a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=0;这样构成回路,数三个人,当数到3的人退出,看最后一个是哪个人,用上面的数组方法怎么做编写比较简洁?

解决方案 »

  1.   

    public class Josephus {
         public static void main(String args[]) {    
          if(args.length != 2) { //处理参数数目不正确情况
           System.out.println("Please Input a number!");
           return;
          }
          
          int i, j, n, m;
          n = Integer.parseInt(args[0]);
          m = Integer.parseInt(args[1]);
          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) break;
               System.out.println("No." + a[i] + " is out!");
               a[i] = -1;   //表示该人离开
               k++;
          }
          
          System.out.println("No." + a[i] + " is the winner!");
         }
    }