智力题 开灯问题

来源:互联网 发布:开启windows休眠 编辑:程序博客网 时间:2024/05/29 19:59

题目:

对一批编号为1-100,全部开关朝上(开)的灯进行以下操作:凡是1的倍数反方向拨一次开关;2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关……问:最后为关熄状态的灯的编号是哪些?

分析:

就某个亮着的灯而言,如果拨其开关的次数是奇数次,那么,结果它一定是关着的。根据题意可知,号码为N的灯,拨开关的次数等于N的约数的个数,约数个数是奇数,则N一定是平方数。

证明:

如果数m是n的约数,那么数n/m一定也是n的约数,(它们是一对)。

但如果n是完全平方数时,存在这样的情况:m=根号n,m是n的约数,n/m与m相等(在其他情况下两者都不相等)(此时单一个约数

由以上两点可得n的约数个数一定是奇数

因为10^2=100,可知100以内共有10个平方数,即,最后关熄状态的灯共有10盏,编号为1、4、9、16、25、36、49、64、81、100。

程序如下:

#include <iostream>using namespace std;//对一批编号为1-100,全部开关朝上(开)的灯进行以下操作:凡是1的倍数反方向拨一次开关;//2的倍数反方向又拨一次开关;3的倍数反方向又拨一次开关……问:最后为关熄状态的灯的编号是哪些?int main() {bool a[100]={0};for(int i=0;i<100;i++){a[i]=1;}for(int i=0;i<100;i++){for(int j=0;j<100;j++){if((j+1)%(i+1)==0){a[j]=!a[j];}}}for(int i=0;i<100;i++){if(a[i]==0){cout<<i+1<<"\t";}}return 0;}
运行结果如下:

1 4 9 16 2536 49 64 81 100


0 0
原创粉丝点击