最后亮的电灯数

题目

有n个灯排成一排,开始全部为灭。有n个学生,第一个学生把所有是1倍数的灯开关按一下(灯打开),此时所有灯都打开;第二个学生把所有是2倍数的灯按一下开关(开启变为关闭,关闭变为开启);第三个学生把所有是3 倍数的灯按一下……,以此内推,直到第n个同学把所有是n倍数的灯按一下开关。

注:灯只有两种状态,开启和关闭,开启状态按一下可以转换为关闭状态,关闭状态按一下可以转换为开启状态。

解答

对于一个灯,无论按多少次开关,只要是按的开关总次数是奇数,那么这个灯最终就是开启状态;只要是按的开关总次数是偶数,那么这个灯最终就是关闭状态。
一个灯被按的次数就是这个灯编号的因数的个数,要求有多少个灯亮着就是有多少个灯编号的因数个数是奇数。一个数的因数有奇数个,即这个数的因数是左右对称,同时中间有一个,即X×Y=n,当X=Y时,有一个值。也就是一个完全平方数。

推导得到:求n个数中完全平方数的个数。

代码

C语言程序实现

int getPerfectSquare(int n){
    int sum = 0; // 完全平方数的个数
    int i;
    for(i=1; i<=n; i++){
        if(i*i>n){
            break;
        }
        // 打印得到的完全平方数
        printf("%d * %d = %d\n", i,i,i*i);
        ++sum;
    }
    return sum;
}

扩展:

完全平方数问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值