2017-11-14

Program:

  

   有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
   凡报到3的人退出圈子,问最后留下的是原来第几号的那位
 
/*
 * 求解: 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),
 * 凡报到3的人退出圈子,问最后留下的是原来第几号的那位
 * 
 * Date Written:2017-12-14
 * 
 * */

package test;

import java.util.Scanner;

public class TestDemo {
    
    public static void main(String args[]) {
    
        Scanner scan = new Scanner(System.in);
        System.out.println( "请输入人数:" );
        int n = scan.nextInt();                //通过用户输入确定人数
        scan.close();
        int position = getPosition(n);    
        System.out.println( "最后剩下的人,原来排在第 " + position + " 位" );
        
    }
    
    //定义算法
    public static int getPosition(int n) {
        
        int[] flag = new int[n];      //设置等长数组,用于标记对应人是否出局
        int index = 0;                //记录当前遍历的人在flag中对应的下标
        int remainCount = n;          //记录剩余人的个数
        int count = 0;                //记录当前遍历人数应该喊几(喊3的出具)
        
        //循环遍历,直到剩下一个人
        while(  remainCount > 1  ) {
            
            if( flag[index] == 0 ) {      //当前人员没有出局
                
                count += 1;               //当前人应喊得数字    
                if( count == 3 ) {        //如果数字为3
                    
                    count=0;              //重置计数变量为0,重新开始
                    flag[index] = 1;      //修改标记,将当前人员出局
                    remainCount--;        //剩余人员个数减1
                }
            }
            
            index += 1;                    //下标加1,遍历下一个人员
            
            if( index == n ) {             //如果遍历到最后一个人,跳转到第一个人再开始遍历
                
                index = 0;
            }
        }
        
        /*
         * 遍历标记数组flag,找到最终剩下的人(对应标记为0)
         * */
        for( int i = 0; i < flag.length; i++ ) {
            
            if( flag[i] == 0 ) {
                
                index = i;
                break;
            }
        }
        
        //位置=下标+1
        return index + 1;
    }
}

 

posted @ 2017-11-14 22:06  空芯菜  阅读(128)  评论(0编辑  收藏  举报