开灯问题
问题描述:
开灯问题,有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 }