解题思路:数组对应编号取反
注意事项:我自己想的,还有不少可以优化的,注释很详细的解释了我的代码
参考代码:
#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 人评分
这可能是一个假的冒泡法浏览:1071 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:778 |
WU-陶陶摘苹果2 (C++代码)浏览:1018 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:565 |
1009题解浏览:802 |
字符逆序 (C语言代码)浏览:645 |
2003年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:721 |
简单的a+b (C语言代码)浏览:572 |
蓝桥杯历届试题-翻硬币 (C++代码)浏览:955 |
数列排序 (C语言代码)浏览:674 |