有n盏灯,编号为1~n,第一个人把所有灯打开,第二个人按下所有编号为2的倍数开关(这些灯将被关掉),第三个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),一次类推,一共有k个人,问最后哪些灯开着?
输入: 7 3
输出 : 1 5 6 7
思路,用一个布尔数组去保存灯的开关状态,为true时是开着的,false为关闭着的,然后做一次遍历即可,详情看代码
#include<stdio.h> #include<string.h> #define maxn 1010 int a[maxn]; int main() { int n,k,first=1; memset(a,0,sizeof(a)); //清零数组 scanf("%d%d",&n,&k); //k个人对n盏灯进行操作 for(int i = 1;i <= k;i++) for(int j = 1;j <= n;j++) if(j % i == 0) a[j] =! a[j]; //输出最后剩下的灯的编号 for(int i = 1;i <= n;i++) if(a[i]) { if(first) first = 0; else printf(" "); printf("%d",i); } printf(" "); return 0; }