首页 > 代码库 > 亮灯问题
亮灯问题
2015盏灯,一开始全部熄灭,序号分别是1-2015,先把1的倍数序号的灯的开关全部按一次,然后把2的倍数的灯的开关全部按一次,然后把3的倍数的开关按一次,以此类推,最后把2015的倍数灯的开关按一次。问最后亮着的灯有多少盏?A. 43B. 44C. 45D. 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的最大平方数},利用给出的选项即可得到结果 。
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){ if(arr[j] == 0){ arr[j] = 1; }else if(arr[j] == 1){ arr[j] = 0; } } } } for(i=1;i<=2015;i++){ if(arr[i] == 1){ count++; } } printf("-->%d\n",count);//44}
亮灯问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。