开灯问题

Posted 认真生活、快乐工作 - 马云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开灯问题相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <math.h>
// 算法竞赛的目标是编程对任意输入均得到正确的结果。
// 请先独立完成,如果有困难可以翻阅本书代码仓库中的答案,但一定要再次独立完成。
// “抓住主要矛盾”——始终把学习、实验的焦点集中在最有趣的部分。如果直观地解决方案行得通,就不必追究其背后的原理。
// 编程不是看书看会的,也不是听课听会的,而是练会的。

/**
【题目】开灯问题
有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2
的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯
将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输
入n和k,输出开着的灯的编号。k≤n≤1000。
样例输入:
7 3
样例输出:
1 5 6 7
*/


/**
【分析】通过数组来存储所有的电灯信息,剩下的就是判断倍数以及,电灯开关判断的问题了
*/
#define max 1100
int a[max];
int main()
{
    int n,k;
    scanf("%d%d",&n,&k);

    if (k>n || n> 1000 || k<0) {
        printf("Input Error");
        return 0;
    }

    memset(a,0,sizeof(a)); // 设置所有灯为关闭 0表示关闭,1表示开启

    int i,j;
    for (i=1;i<=k;i++) {
        for(j=1;j<=n;j++) {
            //依次对电灯进行处理
            if (j%i == 0) { // 判断倍数的,太精辟了
                a[j] = !a[j];
            }
        }
    }

    for (j=1;j<=n;j++) {
        if (a[j]) {
            printf("%d\\t",j);
        }
    }

    printf("\\n");

    return 0;
}


点评:这个有点意思。

以上是关于开灯问题的主要内容,如果未能解决你的问题,请参考以下文章

开灯问题

开灯问题

开灯问题

开灯问题--------《算法竞赛入门指导》P83

NYOJ_77 开灯问题

算法竞赛入门经典_3.1_数组_逆序输出_开灯问题