一.问题:
1. 房间里面有50盏灯,编号为1~50,初始状态为打开 ,有10个学生,编号为2,4,6,8等,他们每一次进入房间之后都拨动开关 ,当灯的编号能够整除他们的编号时, 他们才可以拨动开关,完成之后退出,请问当最后一个学生退出时,还有多少盏灯亮着?
二.思路:
1. 先考虑如何表示灯,灯编号,学生,学生编号
2.再考虑学生进入房间后的操作:
- 每一个学生,每一灯都需要进行一次,因此采取遍历;
- 如何拨动开关,先取余,符合条件的进行取反;
3.最后输出灯依然开着的编号。
三.代码:
int main()
{
int light[50] = {0};
int stu[10] = {0};
int i = 0;
int j = 0;
for (i = 0; i < 50; ++i)
light[i] = 1;
for (i = 0; i < 10; ++i)
stu[i] = 2 * (i+1);
for (i = 0; i < 10; ++i)
for (j = 0; j < 50; ++j)
if ((j+1) % stu[i] == 0)
light[j] = !light[j];
for (i = 0; i < 50; ++i)
if (light[i] == 1)
printf("%d\n", i + 1);
return 1;
}
四.总结:
1. 审题一定要准确,如果连自己输出什么都不确定,那很难写出来;
2.代码的规范和简洁有待提高;
3.重视变量的作用域问题。