开灯问题
题目:
有n盏灯,编号1-n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些等将被关掉),
第3个人按下所有编号为3的倍数的开关(其中关掉的等将被打开,开着的灯将被关闭),依次类推。
一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k <=n<=1000。
样例输入:
7 3
样例输出:
1 5 6 7
分析
用a[1],a[2] ... a[n]表示编号为1,2,3,... , n的灯是否开着。模拟这些操作即可。
c实现
#include<stdio.h> #include<string.h> #define maxn 1010 int a[maxn]; int main() { //n盏灯,k个人,first标记是否是第一个元素 int n,k,first=1; memset(a,0,sizeof(a)); scanf("%d%d",&n,&k); 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("\n"); return 0; }