开灯问题
有n盏灯,编号为1~n.第1个人把所有灯打开,第2个人按下所有编号为2的倍数开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关,以此类推。一共有k个人,问最后哪些灯是开着?输入n和k,输出开着的灯的编号。k<=n<=100
•样例输入
7 3
•样例输出
1 5 6 7
思路:1.定义一组数组,初始化状态为0(开灯状态用1表示,关灯状态用0表示)
2.遍历循环k个人的操作,判断灯的号码是否为第i个人的倍数,符合条件则取反灯的开关状态
3.最后遍历数组,输出状态为1的灯的编号
代码如下:
#include<stdio.h> #include<string.h> int main() { int n,k; int a[1010]; memset(a,0,sizeof(a));//假设0表示灯关着,1表示灯开着,初始设置所有灯为关闭 scanf("%d%d",&n,&k);//输入n盏灯,k个人 for(int i=1;i<=k;i++)//第1~k个人 for(int j=1;j<=n;j++) if(j%i==0) a[j]=!a[j];//判断灯的号码是否为第i个人的倍数,符合条件则取反灯的开关状态 for(i=1;i<=n;i++) if(a[i])//输出开着的灯的编号 printf("%d ",i); printf("\n"); return 0; }