开灯问题

Posted 菜鸟奋斗史

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开灯问题相关的知识,希望对你有一定的参考价值。

问题描述:

     开灯问题,有n盏灯,编号为1~n。第一个人把所有灯都打开,第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。

算法实现:

 1 package com.ysw.test;
 2 
 3 import java.util.Arrays;
 4 import java.util.Scanner;
 5 
 6 /*
 7  * 问题描述: 开灯问题,有n盏灯,编号为1~n。
 8  * 第一个人把所有灯都打开,
 9  * 第二个人按下所有编号为2的倍数的开关(这些灯将被关掉),
10  * 第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),
11  * 以此类推。一共有k个人,问最后有哪些灯开着?
12  * 输入n和k,输出开着的灯的编号。
13  * 
14  */
15 public class openAndCloseLantern {
16 
17     /**
18      * @param args
19      */
20     public static void main(String[] args) {
21         // 定义数组
22         int myArray[] = new int[1000];
23         // 函数:Arrays.fill(int myArray[],int value)将数组元素的值全部置为0
24         Arrays.fill(myArray, 0);
25         // 从键盘读取读取灯的数量和人的数目
26         Scanner reader = new Scanner(System.in);
27         // 灯的盏数
28         int lanternNum = reader.nextInt();
29         // 人的数量
30         int personNum = reader.nextInt();
31         for (int i = 1; i <= personNum; i++) {
32             for (int j = 1; j <= lanternNum; j++) {
33                 // 当j%i==0的时候说明灯的明或者亮的状态发生了改变
34                 if (j % i == 0) {
35                     // 改变灯的状态:用数字1代表亮,用数字0表示灭
36                     myArray[j] = (myArray[j] == 1) ? 0 : 1;
37                 }
38             }
39         }
40         // 输出元素值为1灯的标号,表示经过一系列操作之后依然亮着的灯的编号
41         for (int i = 1; i <= lanternNum; i++) {
42             if (myArray[i] != 0) {
43                 System.out.print(i + " ");
44             }
45         }
46         System.out.println();
47     }
48 
49 }

 

以上是关于开灯问题的主要内容,如果未能解决你的问题,请参考以下文章

开灯问题

开灯问题

开灯问题

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

NYOJ_77 开灯问题

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