开灯问题:
-
有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯编号。k≤n≤1000。
附上代码:
#include<stdio.h> #include<string.h> #define MAX 1000+10 int a[MAX]; int main() { int i, j, n=7, k=3; //memset(a, 0, sizeof(a)); for(i = 1; i <= k; i++){ //人数 for(j = 1; j <= n; j++){ //灯的数量 if(j%i == 0) a[j] = !a[j]; //按下编号为自己编号倍数的开关,通过0,1定义灯的开关状态 } } for(i = 1; i <= n; i++){//遍历灯的数量 if(a[i]) //如果灯开着执行 { if(i == n){//最后一盏灯 printf("%d,", i); } else printf("%d ", i); } } return 0; }