巧用数组:开灯问题

开灯问题

有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下方留言,我会及时回复的,相互学习呀~
(如果博客对您有些许帮助的话,点个赞吧())

猜你喜欢

转载自blog.csdn.net/qq_36560894/article/details/88044229
今日推荐