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
时间: 2024-09-30 08:49:12