开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关掉),以此类推。一共有K个人,最后有哪些灯开着?
输入n和k,输出开着的灯的编号。k≤n≤1000
样例输入
7 3
样例输出
1 5 6 7
分析: 利用数组a[n]来表示不同编号的灯;a[n]是否为0来表示灯的开关即可
代码如下(C语言)
#include<stdio.h>
#include<string.h>
#define maxn 1005
int a[maxn]; // 数组如果过大放在main函数外
int main(){
int n,k;
int first=1; // 使用first来作为是否为第一个输出,为了格式需要
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==1){ first=0; printf("%d",i);}
else printf("% d",i);
}
return 0;
}
博主每天都会更新算法方面或者关于计算机其他方面的blog,大家如果有什么建议或者有更好的思路方法,可以先关注一下博主并在blog下方留言,我会及时回复的,相互学习呀~
(如果博客对您有些许帮助的话,点个赞吧(▽))