解题思路:数组对应编号取反
注意事项:我自己想的,还有不少可以优化的,注释很详细的解释了我的代码
参考代码:
#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复