智力题 开灯问题

该博客解决了一个数学智力问题:1到100的灯按照编号倍数进行开关操作后,哪些灯会处于关闭状态。通过分析发现,灯的编号为完全平方数时,开关次数为奇数,因此灯最终关闭。经过证明,100以内共有10个完全平方数,即1、4、9、16、25、36、49、64、81、100的灯会被关闭。博客还提供了这些数字的列表作为答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

对一批编号为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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值