有n盏路灯,编号为1~n。第1个人把所有的路灯都打开,第2人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的被打开,打开的被关掉),依此类推。一共有k个人,问最后有哪些灯开着?。输入n,k,输出开着的灯的编号。k<=n<=1000。
样例输入:
7 3
样例输出:
样例输入:
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函数外,否则程序可能无法运行。