题目:
对一批编号为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 25
36 49
64 81 100