例题 3-2 开灯问题

有n盏路灯,编号为1~n。第1个人把所有的路灯都打开,第2人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的被打开,打开的被关掉),依此类推。一共有k个人,问最后有哪些灯开着?。输入n,k,输出开着的灯的编号。k<=n<=1000。
 样例输入:
 7 3
 样例输出:

 1 5 6 7  

#include <stdio.h>
#define maxn 1005
int a[maxn];
int main()
{
	int n,k,i=0,j=1;
	scanf("%d%d",&n,&k);
	for(i=0;i<maxn;i++)//可用memset(a,0,sizeof(a));替代本循环作用是把数组清零 
	{
		a[i]=1;
	}
	for(j=2;j<=k;j++)
	{
		i=0;
		while(i<n)
		{ 
			if((i+1)%j==0)
			{
				if(a[i]==0)
				{
					a[i]=1;
				}
				else
				{
					a[i]=0;
				}
			}
			i++;
		}	
	}
	for(i=0;i<n;i++)
	{
		if(a[i]==1)
		printf("%d ",i+1);
	}
}

新知识点:

1、数组复制:从数组a复制k个元素到数组b,memcpy(b,a,sizeof(int)*k) ,若a,b都是浮点型用memcpy(b,a,sizeof(double)*k) ,如果需要把数组a全部复制到数组b,可以写为memcpy(b,a,sizeof(a))。 memcpy在string.h头文件中 

2、比较大的数组应尽量声明在main函数外,否则程序可能无法运行。



猜你喜欢

转载自blog.csdn.net/weixin_27848283/article/details/80979614
今日推荐