开灯问题

有n盏灯,编号1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依次类推。一共有k个人,问最后有哪些灯开着? 
Input
n和k,1≤k≤n≤1000。 
Output
输出开着的灯编号。 
Sample Input
7 3
Sample Output

1 5 6 7


首先要解决的就是:灯的状态如何表示,方法是把每个灯的状态存入一个名为a的整型数组中,a[i]=0表示灯灭,a[i]=1表示灯亮。

                                    如何改变灯的状态。每次进来一个人,就要把教室里的灯全部遍历一遍,如果是该同学编号的倍数,就按一次开关,否则,不改变其状态。很容易能够想到用条件语句来解决问题。

                                   因为是每次进来以为同学都要对灯进行遍历,所以遍历的次数是由进来同学的人数所决定的。因为在循环中,同学人数在外层,灯的数目在内层。

在对灯泡状态进行改变时,有意很细节的问题就

                                                                                 1.首先要将灯泡全部设置为关闭状态,也即是说要给a数组中的全部成全赋值0,memset(a,0,sizeof(a));

                                                                                 2.然后再逐层灯进行修改的时候,要注意到,当a[10]=0,表示第11盏灯是关闭的

                                                                                 3.在重复对第i盏灯修改状态时,a[i-1]=(a[i-1]+1)%2;

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define MAXN 1000+10
int a[MAXN];
int main(){
    int i,j,x,n,k;
    cin>>n>>k;
    memset(a,0,sizeof(a));
    for(j=1;j<=k;j++){
                      for(i=1;i<=n;i++){
                                       if(i%j==0)a[i-1]=(a[i-1]+1)%2;
                                       }
                      }
    for(i=1;i<=n;i++){
                      if(a[i-1])cout<<i;
                      }
    system("pause");
    return 0;
}


猜你喜欢

转载自blog.csdn.net/u013177799/article/details/53517870
今日推荐