解题思路:数组对应编号取反

注意事项:我自己想的,还有不少可以优化的,注释很详细的解释了我的代码

参考代码:

#include"stdio.h"


void main()

{

    unsigned int human;//人数

    unsigned int LED[5001]={};//灯的数组初值0为关闭

    int n=0,i=1,j=0,k=1,th=1,max=0;//n是第几盏灯,i,j为循环中间变量,k是控制逗号,th是倍数,max是倍数最大值(减少运行时间,也可以删掉)


    scanf("%d %d",&n,&human);//输入有多少灯,和有多少人


    if(human==1)    //只有一个人的时候

    {

        for(;i<=n;i++)

        {

            printf("%d",i);

            if(i<=(n-1))  printf(",");

        }

    return;                // 结束主函数

    }                        //直接输出从第一盏灯到最后一盏


    for(i=2;i<=human;i++)

    {

        max=n/i;    //倍数最大值,也可以不加,下面循环的max换成LED,举个例子20盏灯,2的最大倍数是10,3就是20/3 =6

        max++;       //怕有意外情况,懒得细想,就加1容错一下

        for(th=1;th<max;th++)  LED[i*th]=~LED[i*th];     //i是从2加到人数量(因为编号1是所有灯都关,上面考虑了,这里就直接滤过了)

    }                                                                                //th*i就是编号为i的人不同倍数,取反‘~’


    for(i=1;i<=n;i++)  if(!LED[i])  j++;                //算一下从第一盏灯到输入的灯数量有多少是关闭的,这是用来控制后面逗号的数量

    for(i=1;i<=n;i++)                                         //同样的循环,只不过内容换成了输出关闭的编号

    {

        if(!LED[i])

        {

            printf("%d",i);

            if(k<j)             //j是刚刚求的关闭的数量,k从1开始到小于j,每次输出一次编号就输出一个逗号,直到倒数第二个结束

            {

                printf(",");

                k++;

            }

        }

    }

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论