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

n个灯,k个人的开灯问题java实现的相关文章

算法竞赛入门经典_3.1_数组_逆序输出_开灯问题

又是新的一天,继续更新. 今天进入了新的章节,数组和字符串 1.逆序输出问题: 先来看代码吧 #include <stdio.h> //逆序输出 2017-8-16 #define maxn 105 int a[maxn]; int main(int argc, char* argv[]) { //int a[maxn]; int x, n = 0; while (scanf("%d", &x) == 1) a[n++] = x; for (int i = n -

开灯问题

有n盏灯,编号1-n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推.一共有k个人,问最后由哪些灯开着? 输入n和k,1≤k≤n≤1000.输出开着的灯编号. 样例输入: 7 3 样例输出: 1 5 6 7 分析: 使用memset函数,将数组中一定长度中的内容替换成指定字符.其中有三个参数,第一个是需要替换的数组,第二个是替换的值,第三个是长度值,一般使用sizeof函数.

开灯问题(南阳oj77)

开灯问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号.k≤n≤100. 输入 输入一组数据:n和k 输出 输出开着的灯编号 样例输入 7 3 样例输出 1 5 6 7 #include<stdio.h>

开灯问题-----00004

描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号.k≤n≤1000 输入 输入一组数据:n和k 输出 输出开着的灯编号 样例输入 7 3 样例输出 1 5 6 7

开灯问题--------《算法竞赛入门指导》P83

开灯问题. 有n盏灯,编号为1-n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号.k≤n≤1000.样例输入:7 3样例输出:1 5 6 7 我的代码为 #include<iostream> using namespace std; int main(void){ int n,k; cin>>n;

nyist 77 开灯问题

开灯问题时间限制:3000 ms | 内存限制:65535 KB 难度:1描述 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号.k≤n≤1000 输入 输入一组数据:n和k 输出 输出开着的灯编号 样例输入7 3样例输出1 5 6 7 #include<iostream>using

水题 开灯问题

开灯问题时间限制:3000 ms  |  内存限制:65535 KB难度:1 描述    有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推.一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号.k≤n≤1000 输入    输入一组数据:n和k输出    输出开着的灯编号样例输入 7 3 样例输出 1 5 6 7 #include<iost

NYOJ_77 开灯问题

题目地址 分析: 用一个数组来保存每盏灯的操作的次数.推断奇偶就可以推断灯的状态. 最后的输出格式须要注意一下空格的位置,思路就是现输出一个.剩下来的输出在前面加一个空格. 空格用_表示: 1_3_5_7 代码: /* 有n盏灯,编号为1~n,第1个人把全部灯打开, 第2个人按下全部编号为2 的倍数的开关(这些灯将被关掉), 第3 个人按下全部编号为3的倍数的开关(当中关掉的灯将被打开,开着的灯将被关闭),依此类推. 一共同拥有k个人,问最后有哪些灯开着? 输入:n和k.输出开着的灯编号.k≤n

1151: 零起点学算法58——开灯问题

1151: 零起点学算法58--开灯问题 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 3195  Accepted: 1445[Submit][Status][Web Board] Description 计算中心有8个机房,每个机房有n台电脑.每台电脑都有一个编号,比如8号机房编号就为H1到Hn,我们有时又称为H1为1号机器,H2为2号机器,.... 有一天我们学校跻身世界高校100强,全校所