房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次,例如第一位同学把编号是1的倍数的灯的按钮按一下(此时100盏灯全亮),第二位同学把编号是2的倍数的灯的按钮按一下(此时只有50盏灯亮着,50盏被这个人按灭了)……第100位同学把编号是100的倍数的灯(即编号为100的灯)的按钮按一下,请问依次走完后,还有多少盏灯亮着?

方法一.通过模拟同学进出场开关灯实现

/***100盏灯开关的问题通过模拟同学进出实现*1为开,0为关* @author Zodiac**/
public class Demo04 {public static void main(String[] args) {// TODO Auto-generated method stub/*模拟100盏灯,1表示开,0表示关*/byte light[]=new byte[100];/*最后灯开着的数量*/int result=0;/*将灯初始化为全关*/for(int i=0;i<light.length;i++)light[i]=0;/*模拟同学进场进行开关灯*/for(int j=1;j<=100;j++){for(int i=1;i<=100;i++){if(i%j==0){if(light[i-1]==0)light[i-1]=1;elselight[i-1]=0;}             }}/*统计开灯数*/for(int i=0;i<light.length;i++){if (light[i]==1){result++;}            }/*输出开灯的数目*/System.out.println(result);}}

方法二.通过以上进出场开关流程分析,我们可以通过对灯编号进行约数计数来降低复杂度,约数个数为奇数的灯最后是开着的,约数为偶数的灯是关着的。

/***100盏灯开关的问题通过计算约数个数实现* @author Zodiac*/
public class Demo05 {public static void main(String[] args) {// TODO Auto-generated method stub/*保存开灯数量*/int result=0;/*保存约数个数*/int num[]=new int[100];/*将数组初始化为0*/for(int i=0;i<num.length;i++)num[i]=0;/*计算约数个数*/for(int i=1;i<=100;i++)for(int j=1;j<=i;j++){if(i%j==0){num[i-1]++;}}/*统计开灯数*/for(int i=0;i<num.length;i++){if (num[i]%2==1){result++;}         }/*输出开灯的数目*/System.out.println(result);}}

方法三.进一步分析,约数是成对出现的,因此只有完全平方数约数个数为奇数,其他数的约数个数都为偶数,因此本题实际上可以转换为求100内完全平方数的个数。当然答案为10。我们在上面两个代码中将开灯编号打出来,结果如下:

1 4 9 16 25 36 49 64 81 100
10

结果验证了求100内完全平方数的个数。

该题,我是永循序渐进的的思想去解决的,可能一开始不能想到将问题转换为求100以内完全平方数的个数,但是通过模拟实现,再一步步抽象分析优化得到了最简单的模型,当然中间过程并不一定要去代码实现,我这里只是为了做比较。因此给我的启发是遇到问题要分步分析去优化。

问题延伸:如果是n盏灯,k个人呢

这里给出复杂度为O(k*n)的约数个数算法,这里的约数个数是指ni在1-k之间的约数个数,方法一复杂度也为O(k*n)。还没想到怎么优化,读者如果有想法,希望给点指点。

代码:

public class Demo05 {public static void main(String[] args) {// TODO Auto-generated method stubLight light=new Light(10,5);light.calculate();System.out.println("Number of Lights that are open:\t"+light.getResult());Light light2=new Light(100,100);light2.calculate();System.out.println("Number of Lights that are open:\t"+light2.getResult());}}class Light{private int lightNum;   //灯数private int personNum;  //人数private int result=0;   //保存开灯数量/*** @param lightNum* @param personNum*/public Light(int lightNum, int personNum) {this.lightNum = lightNum;this.personNum = personNum;}/*返回开灯数*/public int getResult(){return this.result;}public void calculate(){/*保存约数个数*/int num[]=new int[this.lightNum];/*将数组初始化为0*/for(int i=0;i<num.length;i++)num[i]=0;/*计算约数个数*/for(int i=1;i<=this.lightNum;i++)for(int j=1;j<=this.personNum;j++){if(i%j==0){num[i-1]++;}}/*统计开灯数,打印开的灯的编号*/System.out.print("Lights that are open:");for(int i=0;i<num.length;i++){if (num[i]%2==1){System.out.print(i+1+" ");this.result++;}            }System.out.println();}}

结果:

Lights that are open:1 4 6 7 8 10
Number of Lights that are open: 6
Lights that are open:1 4 9 16 25 36 49 64 81 100
Number of Lights that are open: 10

100盏灯开关的问题相关推荐

  1. 100盏灯开关问题python_100盏灯开关问题

    问题: 有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点 ...

  2. 100盏灯开关问题python_100盏灯泡的开关问题

    有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以 ...

  3. 面试题-100盏灯问题

    题目 一间屋子里有100盏灯排成一行,按从左至右的顺序编号1.2.3.4.5-99.100,每盏灯都有一个开关,开始全部都关着,现有100个学生,第1个学生把1的倍数的灯全部拉一下,第2个学生把2的倍 ...

  4. 面试题—100盏灯问题

    问题描述:有100盏灯,编号依次为1,2,3.100,电灯全部关着.现在来了100个人,第一个人把所有的灯开关按下:第二个人隔一个灯按下(2,4,6-):第三个人每隔两个灯按下(3,6,9-).第10 ...

  5. Android 算法--100盏灯问题

    https://blog.csdn.net/tongsiw/article/details/109826181 问题: 题目描述:问题描述:有100盏灯,编号依次为1,2,3.100,电灯全部关着.现 ...

  6. js:自动亮起100盏灯

    1)    使用js在页面上显示100盏灯,并标记从1到100的编号 2)    页面加载后3秒,从编号是1的灯依次自动亮起. 3)    每过0.5秒亮下一盏灯(10分) 4)    所有灯亮起后, ...

  7. 转载:一道逻辑题 房间里有100盏电灯

    转自:程序猿_哲 一道挺有意思的逻辑题 房间里有100盏电灯,编号为1,2,3--100,每盏灯上有一个按钮,初始时灯全都是关的.        编好号的100位同学由房间外依次走进去,将自己编号的倍 ...

  8. 屋子里有1到100号100盏关闭的灯

    屋子里有1到100号100盏关闭的灯,门外有1到100号100个人,每个人都要进屋一次,把与自己序号对应的和是自己序号倍数的灯绳拉一下,(比如1号要拉所有的灯绳,2号要拉2,4,6的灯绳,而100号只 ...

  9. 一道逻辑题 房间里有100盏电灯

    在 博客园看到的这个问题,也想做一下.题目是这样的 房间里有100盏电灯,编号为1,2,3--100,每盏灯上有一个按钮,初始时灯全都是关的.编好号的100位同学由房间外依次走进去,将自己编号的倍数的 ...

最新文章

  1. 解决element-ui表头错位的问题
  2. 清空oracle表数据 外键,oracle清空所有表数据
  3. windows下mongodb的安装与配置
  4. PHP第六课 使用方法数组
  5. debian下面的apt-fast安装
  6. iOS开发-关于自定义控件很值得一看的文章( 三)
  7. 网络安全之tcp阻截引擎 (一)
  8. 电商咄咄逼人的黑色星期五促销横BANNER设计模板
  9. 使用RESIZE方法解决临时表空间(TEMP)过大问题
  10. bypass最新版d盾mysql_Bypass 护卫神SQL注入防御(多姿势)
  11. 离线环境安装dotnet framework nuget包
  12. Mac如何修改文件默认打开方式?
  13. 广义线性模型之指数分布族期望和方差的推导
  14. 在阿里 AI Lab 做 NLP 高级算法专家是一种什么样的体验?
  15. matlab if嵌套函数,MATLAB嵌套函数的应用
  16. vue 使用fs_在vue里面使用iVew框架
  17. unigine 三维旋转矩阵(mat3,quat) scale translate 变换矩阵(mat4) 和forward up right 关系 normal binormal tangent
  18. Pcbdoc,SchDoc,PrjPcb 的区别
  19. 关于计算机网络实训室的申请书,计算机网络技术综合实训室建设方案.doc
  20. 计算机主机有自带的声音吗,为什么我的电脑没有声音|电脑没有声音怎么办|电脑没有声音怎么回事 - 为什么我的电脑没有声音 - 安全专题...

热门文章

  1. 那些著名或非著名的iOS面试题(上)
  2. cs服务器弹道怎么修改,cs1.6弹道在那个文件夹里或文件里修改?
  3. mysql ocp 认证 题库_Mysql 8.0 OCP认证考试原题整理(CUUG内部题库)-第4题
  4. 幸福的存在,是用来珍惜的,而不是,拿来肆意挥霍的
  5. AS3.0 与网络通信
  6. 金秋十月 一场“春暖花开”的蜜月时光
  7. 最新的Windows Caffe配置方法(Python接口)
  8. linux 内核编译_如何在21世纪编译Linux内核
  9. winform采集网站美女图片程序---多线程篇
  10. 【2202.02543】ConClu:Unsupervised Learning on 3D Point Clouds by Clustering and Contrasting