一:2036开关门
1.1题目
1.2思路
1.每次都是房间号是服务员的倍数的时候做处理,所以外层(i)枚举服务员1~n,内层(j)枚举房间号1~n,当j % i=0时,做处理
2.这个处理指的是,开门的时候变成关门,关门的时候开门,所以可以用取反运算符=!
1.3代码
#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;
}
二:1109开关灯
2.1题目
2.2思路
这个题的本质和上面提的本质是一样的,只是服务员的数量和灯的数量不一定一样,但是代码是差不多的
2.3代码
#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++;}elseprintf(",%d", i);}}return 0;
}