有n盏灯,编号为1~n,第1个人把所以灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),以此类推,问最后有那些灯开着(输出灯的编号)k<=n<=1000
//开灯问题
#include<string.h>
#include<stdio.h>
int main()
{
int n,k,light[1005],first=1,i,z,j;
scanf("%d %d",&n,&k);
memset(light,0,sizeof(light));
for(i=1;i<=k;i++)
{
for(j=1;j<=n;j++)
{
if(j%i==0)
light[j]=!light[j];
}
}
for(z=1;z<=n;z++)
{
if(light[z])
{
if(first)
{
first=0;
}
else
{
printf(" ");
}
printf("%d",z);
}
}
return 0;
}
这里做一下解释,memset的作用是把数组light清零,此外first作为一个记号变量来判断是否为第一个数字!!!