现在有100个标记过的电灯泡。第一个人经过这些灯时,点亮所有的灯,第二个人经过时每隔一盏灯就切换开关一次,第三个人经过时每隔两盏灯切换开关一次。请问,当第100个人经过时,还剩多少盏亮着的灯?

做了一个草图:10(纵10人)X10(横10栈灯)

第一个人:1 1 1 1 1 1 1 1 1 1
第二个人:0 1 0 1 0 1 0 1 0 1
第三个人:0 0 1 0 0 1 0 0 1 0
第四个人:0 0 0 1 0 0 0 1 0 0
第五个人:0 0 0 0 1 0 0 0 0 1
第六个人:0 0 0 0 0 1 0 0 0 0
第七个人:0 0 0 0 0 0 1 0 0 0
第八个人:0 0 0 0 0 0 0 1 0 0
第九个人:0 0 0 0 0 0 0 0 1 0
第十个人:0 0 0 0 0 0 0 0 0 1

从上面的片段中我们看到,第一盏灯:1,第二盏灯:1、2 第三盏灯:1、3 第四盏灯:1、2、4 第五盏灯:1、5 第六盏灯:1、2、3、6 第七盏灯:1、7 第八盏灯:1、2、4、8 第九盏灯:1、3、9 第四盏灯:1、2、5、10  略。

综上:相信大家已经看出来了:

凡是最后亮的灯,都被按过奇数次每盏灯被按的次数,即等于它的约数的个数,比如8号灯,它被第1、2、4、8这四个人按到,所以最后是灭的状态,再比如16号灯,它被第1、2、4、8、16这五个人按到,所以最后是开的状态。
结论:最后,只有完全平方数,其约数个数为奇数,就是亮灯的情况。

这其实就是纯粹的数学问题,没有必要用code去实现了。

时间: 2024-10-04 17:35:20

现在有100个标记过的电灯泡。第一个人经过这些灯时,点亮所有的灯,第二个人经过时每隔一盏灯就切换开关一次,第三个人经过时每隔两盏灯切换开关一次。请问,当第100个人经过时,还剩多少盏亮着的灯?的相关文章

【编程题】不引入第三个变量,而交换两个变量的值

不引入第三个变量,而交换两个变量的值 方法一:算术运算 1 int a,b; 2 a=10;b=12; 3 a=b-a; //a=2;b=12 4 b=b-a; //a=2;b=10 5 a=a+b; //a=12;b=10 它的原理:把a,b看做数轴上的两个点. 第一句"a=b-a"求出了ab两点之间的距离,并且将其保存在a中: 第二句"b=b-a"求出了a到原点的距离(b到原点的距离减去ab两点距离),并且将其保存在b中: 第三句"a=b+a"

浅析JavaScript和PHP中三个等号(===)和两个等号(==)的区别

先做个简单的介绍,让先有个直观的认识 == equality 等同 === identity 恒等 == 两边值类型不同的时候,要先进行类型转换,再比较. === 不做类型转换,类型不同的一定不等. 举例说明: "1" == true 类型不同,"=="将先做类型转换,把true转换为1,即为 "1" == 1: 此时,类型仍不同,继续进行类型转换,把"1"转换为1,即为 1 == 1: 此时,"==" 左

(DT系列三)系统启动时, dts 是怎么被加载的

一,主要问题:系统在启动的时候,是怎么加载 dts的:Lk,kernel中都应调查. 二:参考文字dts加载流程如下图所示: 启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree装入内存,把地址等相关信息传给kernel.kernel中,会根据传入的信息创建设备.1,先从little kernel开始:1.1 总体来说Lk/arch/arm/crt0.S文件中语句:bl kmain调用的是lk/kernel/mai

【转】(DT系列三)系统启动时, dts 是怎么被加载的

原文网址:http://www.cnblogs.com/biglucky/p/4057481.html 一,主要问题:系统在启动的时候,是怎么加载 dts的:Lk,kernel中都应调查. 二:参考文字dts加载流程如下图所示: 启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree装入内存,把地址等相关信息传给kernel.kernel中,会根据传入的信息创建设备.1,先从little kernel开始:1.1 总

当一个低级问题,第一次解决时,你会感受到成就;第二次解决时,你感受到责任,第三次解决时,你可能更多的感受到无力(转)

年轻的同学喜欢按学习曲线来看自己过去的每一年,但是这种方式很快就会步入到瓶颈,学习曲线增长突然会变得缓慢.在 2013 年圣诞节时,Tim 还在每天花上 10-30 分钟玩一款叫 Clash of Clans 的游戏,并邀请身边的朋友都加入了部落,当时每天的升级成长也很快.但不知道从哪一天开始,发觉升级越来越慢了,需要 2 周或者更长时间才能将一些对象升级,所以慢慢的对其失去了成就感.耐心与好奇心. 工程师对于技术的关系也是如此,刚接触第一门编程语言时候,对每一个细节充满了好奇心,发现一种新的语

TCP 为什么是三次握手,而不是两次或四次?

TCP是一种全双工的可靠传输协议,核心思想:保证数据可靠传输以及数据的传输效率 A------B 二次握手: 1.A发送同步信号SYN+A's initial sequence number 2.B发送同步信号SYN+B's initial sequence number +B's ACK sequence number 这里存在一个问题,假设A和B初始列号一致,但B无法知道A是否已经收到自己的SYN,如果这个SYN丢失,则A和B的初始序号将无法达成一致,从而不能保证数据的可靠传输. 四次握手:

计算两个日期相隔天数 思路:假设1998-10-10 2010-5-5 首先获取1889-10-10这个日期在这一年中还剩多少天 再次获取2010-5-5这个日子在这一年内已经过了

class FunDemo6 { public static void main(String[] args) { //测试函数getDays //System.out.println(getDays(1992,4,20)); System.out.println(subDays(1999,1,5,2001,3,10)); } //判断是否为闰年 public static boolean isLeap (int y) { if(y%4==0&&y%100!=0||y%400==0) re

我的Java开发学习之旅------>解惑Java进行三目运算时的自动类型转换

今天看到两个面试题,居然都做错了.通过这两个面试题,也加深对三目运算是的自动类型转换的理解. 题目1.以下代码输出结果是(). public class Test { public static void main(String[] args) { int a=5; System.out.println("value is :"+((a<5)?10.9:9)); } } A.编译错误     B.10.9           C.9           D.以上答案都不对 我不假

三种传值方式遇上两个数的交换

最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递:为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制. 先看看源代码: 1 #include<iostream> 2 using namespace std; 3 int swap1(int m1,int m2)//单向值传递 4 { 5 int temp = m1; 6 m1 = m2; 7 m2 = temp; 8 cout<<m1<