分析:第1个人会将灯全灭,所以相当于从第2个人开始,初始时灯是关的,从2往后都做相反处理。
#include <stdio.h>
int main()
{
int a[5000] = { 0 }; //定义标记数组。对于灯,0为关闭,1为打开。
int n, m , d=0, i, j; // 依次为人数,灯数,判断是否为第一个处于关闭状态的灯。
scanf("%d %d", &n, &m);
for (i = 2; i <= m; i++) { // 灯从2号到m号
for (j = i; j <= n; j=j+i) { //使成倍数增长
a[j] = (a[j] == 1 ? 0 : 1); //进行翻转。(这一步也可写成下面部分)
//if (a[j] == 1) {
// a[j] = 0;
//}
//else{
// a[j] = 1;
//}
}
}
for (i = 1; i <= n; i++) {
if (a[i] == 0) {
if (d == 0) // 若是第一个处于关闭状态的灯
{
printf("%d", i); //直接输出,第一个不用输出逗号
d = 1; //使接下来的for循环跳过这个内部if判断
}
else printf(",%d", i);//其余数后面要输出逗号
}
}
return 0;
}