1.每次都是房间号是服务员的倍数的时候做处理,所以外层(i)枚举服务员1~n,内层(j)枚举房间号1~n,当j % i=0时,做处理
2.这个处理指的是,开门的时候变成关门,关门的时候开门,所以可以用取反运算符=!
#include <stdio.h>
//2036开关门
int main()
{
int arr[1005] = { 0 };
int n = 0;
scanf("%d", &n);
int i = 0;
for (i = 2; i <= n; i++)
{
int j = 0;
for (j = 1; j <= n; j++)
{
if(j % i==0)
arr[j] = !arr[j];
}
}
for (i = 1; i <= n; i++)
{
if (arr[i] == 0)
{
printf("%d ", i);
}
}
return 0;
}
这个题的本质和上面提的本质是一样的,只是服务员的数量和灯的数量不一定一样,但是代码是差不多的
#include <stdio.h>
//1109开关灯
int main()
{
int arr[50008] = { 0 };
int n = 0, m = 0;
scanf("%d %d", &n, &m);
int i = 0;
for (i = 2; i <= m; i++)
{
int j = 0;
for (j = 1; j <= n; j++)
{
if (j % i == 0)
{
arr[j] = !arr[j];//取反逻辑
}
}
}
int cont = 0;
for (i = 1; i <= n; i++)
{
if (arr[i] == 0)
{
if (cont == 0)
{
printf("%d", i);
cont++;
}
else
printf(",%d", i);
}
}
return 0;
}