java开灯问题_算法题-开灯问题原题如下:
有 n 盏灯,编号 1~n(0
⽐如输⼊:10 2 输出最后亮灯的编号:1,3,5,7,9
注意:使⽤循环语句实现。
java和c都可以实现,下⾯代码将使⽤java来实现
⾸先这题有两种解题思路:
可以通过定义⼀个boolean数组判断灯是否打开,然后模拟整个开关的流程
可以先算出⼀个灯被开关的次数,根据开关的次数推断出这个灯现在的开关状态
第⼀种:
⾸先我们要先输⼊两个需要变量,这个两种⽅法是⼀样的:
Scanner sc = new Scanner(System.in);
System.out.println("输⼊灯数:(0
int lampNum = sc.nextInt();
System.out.println("输⼊⼈的数量:");
int manNum = sc.nextInt();
然后定义⼀个boolean数组然后初始化:
boolean[] lamp_flag = new boolean[lampNum];//使⽤boolean数组来判断灯的开关
for(int i=0;i
lamp_flag[i] = true;
}
nextint()方法接下来就是模拟整个关灯开灯的流程:
for(int i=1;i<=manNum;++i) {
if(i==1) {
continue; //因为之前初始化就把所有灯打开了,所以第⼀个跳过就可以了
}
for(int j=1;j<=lampNum;++j) {
if(j%i==0) {
if(lamp_flag[j-1]==true) {
lamp_flag[j-1]=false;
}else { //如果灯是关的就打开,如果是开的就关闭
lamp_flag[j-1]=true;
}
}
}
}
最后输出:
for(int i=0;i
if(lamp_flag[i] == true) {
System.out.print((i+1)+" ");
}
}
第⼆种:
相⽐第⼀种⽅法模拟整个流程第⼆种⽅法就要简单很多:
for(int i=1;i<=lampNum;i++) {
int count=0;//count⽤来统计⼀个灯开关的次数
for(int j=1;j<=manNum;j++){
if(i%j==0){//灯是⼈数的倍数即灯被按下⼀次
count++;
}
}
if(count%2==1){//灯原始状态为熄灭,因此灯泡被按下单数次即灯泡是打开的System.out.printf("%d ",i);
}
}
最后本⼈才疏学浅,如果发现有错误或者有不同的,更优的算法,请在评论指出万分感谢本⽂作者为 mowang ,转载请注明

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。