zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    WCF 订单服务(2)
    移动应用接口的授权和安全
    数据库服务器死锁的解决方法 (转)
    WCF 订单服务(3)
    sqlservice 表分区方法
    基于.NET解决方案的架构和框架
    IIS7架构原理
    多线程的同步和通信
    【原创】关于wince OS开发面试问题的总结系列之OAL
    【原创】关于noot的学习笔记
  • 原文地址:https://www.cnblogs.com/caizhen/p/7834993.html
Copyright © 2011-2022 走看看