问题简述:有N个灯(并编号1.2.3.4…..n),K个人。第一个人打开所有灯,第二个人按下2的倍数开关,第三个人按下3的倍数开关,以次类推。。。。问最后有哪些灯还是亮着的,
解析:只要解决如何表示灯的开与关,这个问题就基本上解决了,这里先灯默认为关,即0。再每次按下开关就执行一次a[j]=!a[j],看最后的状态就OK!
include “stdio.h”
include “string.h”
int a[1010];
int main()
{
int n, k, first=1;
memset(a,0,sizeof(a)); //将数组a[1010]置零,即默认为关闭状态。
scanf(“%d%d”,&n,&k);
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++) if(j%i==0) a[j]=!a[j]; //a[j]=!a[j](1与0,翻转,1为开,0为关)
}
for(int i=1;i<=n;i++)
if(a[i])
{
if(first) first=0;
else printf(” “);
printf(“%d”,i);
}
printf(“\n”);
return 0;
}
小结:找到核心问题,明确表示方法,最后写出代码,OK!