POJ 1218 THE DRUNK JAILER(开关问题)

开关问题的最简单解法,没学数论前感觉很麻烦,现在看来很有启发
Description
一个监狱看守员喝醉了酒,于是把监狱每扇门都打开(假设有n扇门);然后再从1号门开始,隔一扇关一个门(把2的倍数的门关掉);接着再从1号门开始,隔2扇操作一个门(操作3的倍数的门,原来是开的关掉,关着的则打开)。这样一直操作到n的倍数,问最后有多少扇门是打开的。这个也可以叫关灯问题:有n个灯,分别由n个开关控制,拨一下开关则可以改变灯的状态(开->关 关->开)。初始状态灯都是关着的,先把每个开关都拨一下,然后拨一下2的倍数的开关,接着3的倍数,直到n的倍数,问最后有多少灯是开着的。
Input
第一行一个整数t代表用例组数,以后每行一个整数m代表灯数(5<=n<=100)
Output
对于每组用例,输出最后开着的灯的个数
Sample Input
2
5
100
Sample Output
2
10
Solution
此题显然是一道经典开关问题,简单模拟题目所给操作即可得出答案,但此处给出另一种简单解法:
这题其实是求完全平方数个数的问题。设有n个门,有一数k<=n,若k有x个约数,则遍历的过程中必然对k操作x次。第k个门一开始是关的,若x为偶数,最后依然是关的,若x为奇数,最后一定是开的。问题变成求约数是奇数的门的个数。对于数N,若该数有约数B,则N/B也必定为该数的约数。当B==N/B时,N的约数为奇数个,N=B*B,即N为完全平方数。 问题转化成求N以内完全平方数的个数。将1…N尽可能地放入一个平方网格中,则对角线上的数必定为完全平方数,网格的最大下标就是N以为完全平方数的个数。即对N开方取整。
Code

#include<stdio.h>
#include<math.h>
int main()
{
    int T,N;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&N);
        printf("%d\n",(int)sqrt(N));
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值