以下是在网上看到的一道题目:
大厅里有100盏灯,每盏灯都编了号码,分别为1-100。每盏灯由一个开关来控制。(开关按一下,灯亮,再按一下灯灭。开关的编号与被控制的灯相同。)开始时,灯是全灭的。现在按照以下规则按动开关。
第一次,将所有的灯点亮。 第二次,将所有2的倍数的开关按一下。 第三次,将所有3的倍数的开关按一下。 以此类推。第N次,将所有N的倍数的开关按一下。 问第N次(N大于等于2,且小于等于100)按完以后,大厅里还有几盏灯是亮的。
请编程实现上面的逻辑,以N为参数
我的思路如下:
1,灯的状态变化是什么。灯的开关只有俩种状态,非开即关。所以用一个变量定义一下开关状态,我用数组的值A或B来定义灯的开关,其实我觉得用一个布尔值会更好。
if(i%n==0){ if(lamp[i]=="A"){ lamp[i]="B";}else { lamp[i]="A"; }}
2,灯的状态如何变。第一次,全变。第二次,2的倍数变一次。第三次,3的倍数变一次。以此类推可以得出:每一次,但凡是次数整数倍的都会变。所以我用取余为0来判断是否进行变换。那么,它的开关次数的逐次递增用一个for循环来解决。
for(int n=1;n
3,在灯的变化结果已经出来时,就是统计最后开着的灯的数量。用判断,累计。
(PS:对于count有定义却没有初始化值,导致一直出错却找不到原因,一般来说定义都有默认初始化的值,但是总有不确定隐患发生,所以还是要谨慎***)
for(int i=0;i<100;i++){ System.out.print(lamp[i]); if(lamp[i]=="A"){//output the number of lamp how many is open count=count+1; } }System.out.println();System.out.print("the number of open lamp is:"+count);
全部代码显示如下:
import java.util.Scanner;class Demo12{public static void main(String[] args){ change();} public static void change(){ //I have forget to initialize the value count,that make a false and I spend half an hour to find it. int count=0; int N; String[] lamp={"B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B","B"}; //define the volue of N as the number of times System.out.println("please input an number:"); Scanner key=new Scanner(System.in); N=key.nextInt(); for(int n=1;n