n个灯,k个人的开灯问题java实现

  有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