N个人开关N盏灯的问题的思考

问题:有N个灯放在一排,从1到N依次顺序编号。有N个人,也从1到N顺序编号。1号将灯全部关闭,2号将凡是2的倍数的灯全部打开;3号将3的倍数的灯全部作相反操作(该灯如为打开,则将它关闭;如关闭,则将灯打开)。以后的人,都和3号操作一样,将凡是自己序号倍数的灯作相反操作。第N个人操作完之后,一共有几盏灯亮着?解题:1. 第M(M<N)个人的操作只能影响到后面M到N盏灯,无法影响到前M-1盏灯,所以第M个人操作后,这个状态下灯的亮灭个数F(M)=F(M-1)+0/1(当第M盏灯操作了偶数次时,加0;当第M盏灯操作了奇数次时,加1)2. 第M盏灯操作了多少次,等价于M这个数有多少个因数,所以F(M)=F(M-1)+0/1(M的因子个数为偶数,加0;M的因子个数为奇数,加1)3. 一个数要么是素数,因子个数为2(1和它自身),要么是合数,因子个数为奇数(只含有1个质因子,即为平方数时)或偶数(假设其有n个质因子,则其因数的总个数为C0n+C1n+…CNn,化简后为若n为偶数,2x(C0n+C1n+…+C((n-1)/2))+C(n/2)n),偶数+偶数=偶数;若n为奇数2x(C0n+C1n+…+C((n-1)/2)),2x任意数=偶数 )4. 所以,只有这个数为平方数时,其因子的个数才为奇数5. 所以,F(M)=F(M-1)+0/1(当M为非平方数时,加0;当M为平方数时,加1)6. 所以,此问题最终公式为:对N开根号,将其整数部分提取出来即为答案7. 编程实现:result = (int)(sqrt(N));

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值