亮灯问题

2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?

A. 43
B. 44
C. 45
D. 46


以下是博友的答案:

按过奇数次的会亮。对除了1以外的所有数(1只按了一次),1和它本身肯定会按,除了这两次,只能按奇数次,所以只有完全平方数,44的平方=1936,所以选B

44 这个题就是在考察这个数的因数的个数的问题。求不大于2015的平房和的那个数。例如8的因数有1 2 4 8有4个因数因此四次之后灯会灭。那么什么样的数因数个数是奇数个呢,任何一个数只要它有一个可分解的因子必有另一个对应的因子相乘等于它都是成对出现的,因此我们考虑因子对应的另外一个因子是它自身的情况。

简单思考之后发现,一个数如果有偶数个约数,则最后是暗的,如果有奇数个约数,则最后是亮的。所有的质数都有两个约数,1和自身,所以最后一定是暗的,对于合数,如果不是平方数,则约数一定是成对出现的,比如8分解为2和4,只有平方数才有奇数个约数,所以这个问题等价于求2015以下的平方数有多少个,答案是44个。

答案是44。思路:某灯亮着→该灯被按了单数次→ 该灯有单数个正约数,所以找到1到2015中正约数个数为单数的数字即可。观察发现,只有完全平方数的正约数才是单数个(若不是完全平方数,它的任意一个约数总有另一个约数与之对应)。所以亮着的灯分别是{1的平方,2的平方,3的平方,。。。,不大于2015的最大平方数},利用给出的选项即可得到结果 。
#include <stdio.h>   
void main(){
   int arr[2016]={0};//刚开始全灭 int i,j; int count=0; for(i=1;i<=2015;i++){ for(j=i;j<=2015;j++){ if(j % i == 0){ arr[j] = arr[j]==0 ? 1 : 0; } } } for(i=1;i<=2015;i++){ if(arr[i] == 1){ count++; } } printf("-%d- ",count); }
原文地址:https://www.cnblogs.com/wwzyy/p/6172204.html