1号同学将所有的灯都关掉;2号同学将编号为2的倍数的灯都打开;3号同学则将编号为3的倍数的灯作相反处理(该号灯如打开的,则关掉;如关闭的,则打开);以后的同学都将自己编号的倍数的灯,作相反处理。问经n个同学操作后,哪些灯是开着的?
算法如下:
#include <stdio.h>
int main()
{
int a[1000] = {0};
int n=0, m=0, i=0, j=0, t = 0;
scanf("%d,%d", &n, &m);
for (i = 2; i <= m; i++)
for (j = i; j <= n; j = j + i)
a[j] = (a[j] == 1 ? 0 : 1);
for (i = 1; i <= n; i++)
if (a[i] == 0)
{
if (t == 0)
{
printf("有%d盏灯是开的\n", i);
t = 1;
}
else printf("有%d盏灯是开的\n", i);
}
return 0;
}
运行结果如下:例如输入20个同学,20盏灯
![](https://img-blog.csdnimg.cn/img_convert/a30b6269b2193fc644486e76c7f6417b.png)