一道逻辑题 房间里有100盏电灯
来源:互联网 发布:心知天气api 更改城市 编辑:程序博客网 时间:2024/04/29 05:59
在博客园看到的这个问题,也想做一下。题目是这样的
房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次,例如第一位同学把编号是1的倍数的灯的按钮按一下(此时100盏灯全亮),第二位同学把编号是2的倍数的灯的按钮按一下(此时只有50盏灯亮着,50盏被这个人按灭了)……第100位同学把编号是100的倍数的灯(即编号为100的灯)的按钮按一下,请问依次走完后,还有多少盏灯亮着?
最简单的做法就是模拟一下100个同学进入房间的情景,从1号同学开始每个人都去按一遍开关,最后看一下哪些灯亮着,这个方法最简单也最容易想到,可是效率有点低。其实可以计算一下每个开关被按下的次数,因为刚开始的时候所有的灯泡都是关着的,所以如果某个灯泡的开关被按了奇数次,那么这个灯泡最终就是开着的,否则就是关着的。那怎么计算每个灯泡开关被按下的次数呢?因为每个同学都会按下自己编号倍数的开关,即如果灯泡编号是同学编号的倍数,他就会按下开关,也就是说如果同学编号是灯泡编号的约数,他就会按下开关(这不是废话么)。那么统计一下灯泡编号约数的个数就可以了,约数个数为计数的灯泡最后开着,约数个数为偶数的灯泡最后关着。下边是代码:
--------------------------------更新------------------------------
又想了一下还有更简单的算法,因为一个数的约数都成成对出现的,也就是说如果n存在一个约数p,那么一定有一个q与之相对应且满足n=pq,所以n约数的个数一定是偶数,但是有一种情况例外,那就是p=q,所以只有编号为完全平方数的灯泡亮着。按着这个方法计算就简单多了,直接return (int)Math.sqrt(100);
房间里有100盏电灯,编号为1,2,3……100,每盏灯上有一个按钮,初始时灯全都是关的。编好号的100位同学由房间外依次走进去,将自己编号的倍数的灯的按钮全部按一次,例如第一位同学把编号是1的倍数的灯的按钮按一下(此时100盏灯全亮),第二位同学把编号是2的倍数的灯的按钮按一下(此时只有50盏灯亮着,50盏被这个人按灭了)……第100位同学把编号是100的倍数的灯(即编号为100的灯)的按钮按一下,请问依次走完后,还有多少盏灯亮着?
最简单的做法就是模拟一下100个同学进入房间的情景,从1号同学开始每个人都去按一遍开关,最后看一下哪些灯亮着,这个方法最简单也最容易想到,可是效率有点低。其实可以计算一下每个开关被按下的次数,因为刚开始的时候所有的灯泡都是关着的,所以如果某个灯泡的开关被按了奇数次,那么这个灯泡最终就是开着的,否则就是关着的。那怎么计算每个灯泡开关被按下的次数呢?因为每个同学都会按下自己编号倍数的开关,即如果灯泡编号是同学编号的倍数,他就会按下开关,也就是说如果同学编号是灯泡编号的约数,他就会按下开关(这不是废话么)。那么统计一下灯泡编号约数的个数就可以了,约数个数为计数的灯泡最后开着,约数个数为偶数的灯泡最后关着。下边是代码:
public class Lamp { public static void main(String[] args){ int result = 0; for(int i=1;i<=100;i++){ if(isOdd(getFactorNum(i))){ result += 1; } } System.out.println(result); } //求n约数的个数 public static int getFactorNum(int n){ int result = 0; for(int i=1;i<=n;i++){ if(n%i == 0){ result += 1; } } return result; } //判断n是否为奇数 public static boolean isOdd(int n){ return (n&1) == 1; }}
--------------------------------更新------------------------------
又想了一下还有更简单的算法,因为一个数的约数都成成对出现的,也就是说如果n存在一个约数p,那么一定有一个q与之相对应且满足n=pq,所以n约数的个数一定是偶数,但是有一种情况例外,那就是p=q,所以只有编号为完全平方数的灯泡亮着。按着这个方法计算就简单多了,直接return (int)Math.sqrt(100);
0 0
- 一道逻辑题 房间里有100盏电灯
- 每天一道算法题——亮着电灯的盏数
- 一道逻辑题
- 一道逻辑题
- 一道逻辑题
- csdn里一道题
- 一道C考试逻辑题
- 一道有趣的逻辑题
- 一道简单逻辑判断题
- 一道有意思的逻辑题
- 一道有趣的逻辑题
- 房间里的大象
- “房间里有100个人,每人都有100元钱,每轮每人要拿一元钱随机给另一个人”最后分布的python结果
- 华为笔试中级题:亮着电灯的盏数
- 《游戏王》中的一道逻辑题
- 一道六嫌疑犯的逻辑判断题
- 一道逻辑题 - 拿走了哪个数
- 一道六嫌疑犯的逻辑判断题
- 视觉SLAM漫谈 (三): 研究点介绍
- 浅谈HTTP中Get与Post的区别
- Intellij IDEA 14.x 中的Facets和Artifacts的区别(转)
- Car的旅行路线
- struct对齐方式
- 一道逻辑题 房间里有100盏电灯
- Spring中遇见的问题
- 黑马程序员--JAVA中的异常处理
- HBase--客户端API(基础知识)二
- struts 验证码图片实例
- Windows下C语言的Socket编程例子(TCP和UDP)
- canvas绘制动画效果
- 第六周 阅读程序(4)
- 剑指offer-丑数