软件工程221班金航


私信TA

用户名:uq_14600592801

访问量:1212

签 名:

这个人不懒,这不是签名吗~

等  级
排  名 9528
经  验 1151
参赛次数 0
文章发表 11
年  龄 19
在职情况 学生
学  校 广西科技师范学院
专  业 软件工程

  自我简介:

从不熬夜只通宵

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

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

参考代码:

#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 人评分

  评论区

  • «
  • »