开灯问题

来源:互联网 发布:鹰身女郎知乎 编辑:程序博客网 时间:2024/05/29 09:40

n盏灯,编号为1-n。第1个人把所有的灯打开,第二个人按下所有编号为2的倍数的开关(这些灯被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,打开的灯将被关闭),以此类推。一共有k个人,问最后有哪些灯开着?输入:nk,输出开着的灯的编号。Kn≤1000。

 输入n和k。

 输出开着灯的编号。


样例输入:

7 3

样例输出:

1 5 6 7


第一眼或许看不出什么结果(大佬们除外),至少我想了很久。 这时,我们布仿可以画一张表(跟据样例)。

灯数            1    2     3    4    5    6   7       

第一个人   o     o    o    o    o    o    o       o=开

第二个人   o    +    o    +    o    +    o         +=关

第三个人   o    +    +    +    o    o    o    


从表中可以轻松的推断出灯被按的次数为  偶数  时,则为 关; 奇数时,则为 开。


因此代码可为:

 #include<stdio.h>
int main()
{
 int n,i,j,k,l;
 scanf("%d%d",&n,&k);
 for(i=1;i<=n;i++)                   
 {
  l=0;                               //初始,灯还没被按。
  for(j=1;j<=k;j++)                  
  {
   if(i%j==0)l++;                    //灯被按了,就加一次
  }
  if(l%2==1)printf("%d ",i);         //次数奇数时,输出灯号
 }
 return 0;
}


总结:通过这道题,我认为在解决C语言问题时,找到其中的数学关系很重要,新手需要学习这样的意识。




原创粉丝点击