.开灯问题

103 阅读1分钟
有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作为一个记号变量来判断是否为第一个数字!!!