zoukankan      html  css  js  c++  java
  • n个灯,k个人的开灯问题java实现

    1.问题描述

      有n个灯,编号为1-n。第一个人把所以灯打开,第二个人按下
    所有编号为2的倍数的开关,第三个人按下3的倍数的开关,依次类推,
    一共有k个人,问最后有哪些灯开着?
      样例输入:
    7 3
      样例输出:
    1 5 6 7

    2.实现代码

    /**
     * 
     */
    package com.sunny.www.interview;
    /**
     * n个灯,k个人的开灯问题
     * 灯类
     * @author sunny
     */
    public class Lamp {
        /**
         * 灯的状态(1:打开;0:关闭)
         */
        private int status;    
        /**
         *     灯的编号
         */
        private int code;    
        
        //使用常变量,避免使用硬编码
        public static final int STATUS_IS_OPEN = 1;    //打开状态
        public static final int STATUS_IS_CLOSE = 0;    //关闭状态
        /**
         * 构造函数
         * @param status 灯的状态
         * @param code 灯的编号
         */
        public Lamp(int status, int code) {
            super();
            this.status = status;
            this.code = code;
        }
        
        /**
         * 按灯操作
         */
        public void press(){
            //如果之前状态是关闭(status=0),按灯操作后状态变成打开(status=1)
            if(Lamp.STATUS_IS_CLOSE == this.status){
                this.status = Lamp.STATUS_IS_OPEN;
            }else if(Lamp.STATUS_IS_OPEN == this.status){ //如果之前状态是打开(status=1),按灯操作后状态变成关闭(status=0)
                this.status = Lamp.STATUS_IS_CLOSE;
            }
        }
        
        public int getStatus() {
            return status;
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        public int getCode() {
            return code;
        }
    
        public void setCode(int code) {
            this.code = code;
        }
    }
    
    /**
     * 
     */
    package com.sunny.www.interview;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Scanner;
    
    /**
     * n个灯,k个人的开灯问题
     * 灯的操作类
     * @author sunny
     */
    public class LampOperation {
        /**
         * 灯的个数
         */
        private int n;    
        /**
         * 人的个数
         */
        private int k;    
        /**
         * 保存n个灯的信息(key=灯的编号;value=灯的实例)
         */
        private Map<Integer,Lamp> lamps;    
        
        public LampOperation(int n, int k) {
            super();
            this.n = n;
            this.k = k;
        }
        
        /**
         * 初始化n个灯的信息
         */
        public void initLamps(){
            lamps = new HashMap<Integer,Lamp>(this.n);
            for(int i = 1; i <= n; i++){
                Lamp lamp = new Lamp(0, i);    //实例化时灯的状态是关闭(status = 0)
                lamps.put(i, lamp);    //实例存入Map            
            }
        }
        
        /**
         * n个灯,k个人的按灯操作
         */
        public void pressBatch(){
            //遍历k个人
            for(int i = 1; i <= this.k; i++){
                //遍历n个灯
                for(int j = 1; j <= this.n; j++){
                    //取余=0
                    if(j % i == 0){
                        lamps.get(j).press();
                    }
                }
            }
        }
        
        /**
         * 打印出状态为打开的灯的编号
         */
        public void printOpenLamps(){
            System.out.println("状态为打开的灯的编号:");
            //遍历集合类的实例前,要先判断是否为空
            if(null != this.getLamps() && !this.getLamps().isEmpty()){
                //遍历map
                for(Entry<Integer, Lamp> entry : this.getLamps().entrySet()){
                    Lamp lamp = entry.getValue();
                    if(Lamp.STATUS_IS_OPEN == lamp.getStatus()){
                        System.out.print(lamp.getCode() + "    ");
                    }
                }
            }
        }
    
        public int getN() {
            return n;
        }
    
        public void setN(int n) {
            this.n = n;
        }
    
        public int getK() {
            return k;
        }
    
        public void setK(int k) {
            this.k = k;
        }    
    
        public Map<Integer, Lamp> getLamps() {
            return lamps;
        }
    
        public void setLamps(Map<Integer, Lamp> lamps) {
            this.lamps = lamps;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);    //从控制台接收参数
            int n = sc.nextInt();    //灯的个数
            int k = sc.nextInt();    //人的个数
            LampOperation lampOperation = new LampOperation(n, k);
            lampOperation.initLamps();    //实例化n个灯
            lampOperation.pressBatch();    //按灯操作
            lampOperation.printOpenLamps();//打印出状态为打开的灯的编号
        }
    
    }

    3.运行效果

    7
    3
    状态为打开的灯的编号:
    1    5    6    7    
  • 相关阅读:
    linux gcc安装
    重装win7后如何恢复ubuntu引导
    Eclipse搭建Android开发环境(安装ADT,Android4.4.2)
    mysql变量使用总结
    最快得到MYSQL两个表的差集
    mysqldb
    更改时间 (时分秒)
    使用命令转移文件
    报喜啦~过了!
    Jmeter接口测试示例
  • 原文地址:https://www.cnblogs.com/sunny08/p/4882378.html
Copyright © 2011-2022 走看看