java丢手帕 约瑟夫问题

一、问题描述: 
    n个人围成一个圈,编号为1~n,从第一号开始报数,报到3的倍数的人离开,一直数下去,直到最后只有一个人,求此人编号。 

二、问题提示: 

     使用一维数组,数组元素初始为1,从1开始把数字放进数组空间,若数组元素为3的倍数,则把其置0,循环下去直到计数器(counter)减为1,则跳出循环并输出其数组下标 

Java代码  收藏代码
    1. import java.util.Scanner;  
    2.   
    3. public class Test {  
    4.   
    5.     /** 
    6.      * @param args 
    7.      */  
    8.     public static void main(String[] args) {  
    9.         // TODO Auto-generated method stub  
    10.   
    11.         System.out.println("请输入一个数字:");  
    12.         Scanner scan = new Scanner(System.in);  
    13.         int n = scan.nextInt();  
    14.         int counter = n;// 计数器  
    15.         int num = 1;// 数数  
    16.         int[] array = new int[n];// 声明数组  
    17.   
    18.         for (int i = 0; i < array.length; i++) {// 数组初始化  
    19.             array[i] = 1;  
    20.         }  
    21.         while (counter > 1) {  
    22.             for (int j = 0; j < array.length; j++) {  
    23.                 if (array[j] != 0) {// 如果数组元素不为0,则从1开始赋值  
    24.                     array[j] = num;  
    25.                     if (num % 3 == 0) {// 如果赋给数组元素的数能够整除3,则把此数组元素置0,计数器减1(即踢掉一个人)  
    26.                         array[j] = 0;  
    27.                         counter = counter - 1;  
    28.                         if (counter == 1) {// 如果最后只剩下一个人,跳出循环  
    29.                             break;  
    30.                         }  
    31.                     }  
    32.                     num = num + 1;  
    33.                 }  
    34.             }  
    35.         }  
    36.         for (int k = 0; k < n; k++) {  
    37.             if (array[k] != 0) {  
    38.                 System.out.println("最后赢家的编号为:" + (k + 1));  
    39.             }  
    40.         }  
    41.   
    42.     }  
    43.   
    44. }  
posted @ 2013-10-12 10:38  qiuhua  阅读(358)  评论(0编辑  收藏  举报