问题描述:有N个灯,(每个灯只有一个开关,按一下开,再按一下关)来了K个人,第一个人把所有灯都打开,第二个人按下了所有编号为2的倍数的灯的开关,第三个人按下所有编号为3的倍数的灯的开关……按此规律。问最后那些灯亮着?
输入:7 3
输出:1 5 6 7
#include<stdio.h> #include<string.h>
int a[1010]; //用数组存储灯的状态int main() { int n,k,i,j; scanf("%d%d",&n,&k); memset(a,0,sizeof(a)); //将数组初始化为0,并默认0状态是灯关闭的状态 for(i=1;i<=k;i++) //遍历k个人按下开关 for(j=1;j<=n;j++) //遍历n个灯 { if(j%i==0) a[j]=!a[j]; //a[i*j]=!a[i*j] //记录按下开关后灯的状态,与之前的状态相反 } for(j=1;j<=n;j++) { if(a[j]) //如果灯是亮着,输出 printf("%d ",j); } }