开灯问题—C语言

                         开灯问题

 有n盏灯,编号为1~n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关,以此类推。一共有k个人,问最后哪些灯是开着?输入n和k,输出开着的灯的编号。k<=n<=100

•样例输入

7 3

•样例输出

1 5 6 7

思路:1.定义一组数组,初始化状态为0(开灯状态用1表示,关灯状态用0表示)

   2.遍历循环k个人的操作,判断灯的号码是否为第i个人的倍数,符合条件则取反灯的开关状态

          3.最后遍历数组,输出状态为1的灯的编号

代码如下:

#include<stdio.h> 
#include<string.h>
int main()
{   
  int n,k;
  int a[1010];
  memset(a,0,sizeof(a));//假设0表示灯关着,1表示灯开着,初始设置所有灯为关闭
  scanf("%d%d",&n,&k);//输入n盏灯,k个人
  for(int i=1;i<=k;i++)//第1~k个人
      for(int j=1;j<=n;j++)
          if(j%i==0) a[j]=!a[j];//判断灯的号码是否为第i个人的倍数,符合条件则取反灯的开关状态
  for(i=1;i<=n;i++)
     if(a[i])//输出开着的灯的编号
         printf("%d ",i);
  printf("\n");
  return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Small-Windmill/p/11691898.html