poj 1218(经典开关问题,模拟)

 经典开关问题:

大概意思如下:一个监狱看守员喝醉了酒,于是把监狱每扇门都打开(假设有n扇门);然后再从1号门开始,隔一扇关一个门(把2的倍数的门关掉);接着再从1号门开始,隔2扇操作一个门(操作3的倍数的门,原来是开的关掉,关着的则打开)。这样一直操作到n的倍数,问最后有多少扇门是打开的。
这个也可以叫关灯问题:有n个灯,分别由n个开关控制,拨一下开关则可以改变灯的状态(开->关 关->开)。初始状态灯都是关着的,先把每个开关都拨一下,然后拨一下2的倍数的开关,接着3的倍数,直到n的倍数,问最后有多少灯是开着的。

 

模拟:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int main()
 6 {
 7     int T;
 8     cin>>T;
 9     while(T--)
10     {
11         int n;
12         int i,j;
13         cin>>n;
14         int a[117];
15         memset(a,0,sizeof(a));
16         for(i=1; i<=n; i++)
17         {
18             for(j=1;j<=n;j++)
19             {
20                 if(j%i==0)a[j]=!a[j];// 每一次都取相反状态
21             }
22         }
23         int k=0;
24         for(i=1;i<=n;i++)
25         {
26             if(a[i]!=0)k++;//如果不等于0,则说明灯开着
27         }
28         cout<<k<<endl;
29     }
30     return 0;
31 }
原文地址:https://www.cnblogs.com/wally/p/2591885.html