今天刷今日头条,看到李永乐老师除了一道数学题,题目如下图:
毕业多年,数学早已忘得一干二净了,那就用编程思路解一下吧。
分析题目
读完整段文字,我们可以得出两个前置条件:
- 100盏灯,分别标号1,2,3,4,....,99,100
- 100个人
什么动作呢?就是这100个人依次对这100盏灯进行开关操作。
从题目得知,这100盏灯默认都是熄灭状态的
- 第一个人把所有灯拉一下,这时候就都亮了
- 第二个人把2的倍数的灯拉一下,这时所有2的倍数的都熄灭了
- 第三个人把3的倍数的灯再拉一下
- 第四个人把4的倍数的灯再拉一下
- 依次类推...
- 第100个人把100的倍数的灯再拉一下(当然这个说的就是第100盏灯)
题目问到最后有哪些灯是亮的。
代码思路
- 初始化一个长度100的数组,表示100盏灯,每项为布尔值
false
,因为灯要么开要么关 ,false
表示关灯,true
表示开灯。 - 把这个数组遍历100次,因为有100个人。第一次全开,第二次找2的倍数取反,第三次取3的倍数取反,第四次取4的倍数取反,根据这个规律修改数组每一项的值。
代码实现
js
// 初始化100盏灯都是false,表示熄灭的
const lights = Array(100).fill(false)
// 人数100
const personNum = 100
把数组遍历100次,用个双层循环,外层表示每个人,内层表示每盏灯,当人的序号 和灯的序号按规则匹配时,修改这盏灯的状态。
js
// 每人依次拉一下灯
for (let i = 0; i < personNum; i++) {
for (let j = 1; j < lights.length + 1; j++) {
// 第一个人把所有灯都打开
if (i === 0) {
lights[j - 1] = true
}
// 第二个人
if (i === 1) {
// 把标号是2的倍数的拉一下
if (j % 2 === 0) {
lights[j - 1] = !lights[j - 1]
}
}
// 第三个人
if (i === 2) {
// 把标号是3的倍数的拉一下
if (j % 3 === 0) {
lights[j - 1] = !lights[j - 1]
}
}
// 第四个人
if (i === 3) {
// 把标号是4的倍数的拉一下
if (j % 4 === 0) {
lights[j - 1] = !lights[j - 1]
}
}
// 以此类推。。。
}
}
这里内层循环j
我是从1开始的,表示灯的编号,用灯的编号对人次进行取余,如果余数为0,就表示是这个人次的倍数,就对这盏灯的状态取反。当然j
也可以从0开始,判断的时候就是j + 1
对人次进行取余,因为题目中所说的编号是从1开始的。然后实际要修改的时候,是修改数组中对应下标的,必须从0开始,所以我这里要减1。
根据以上代码得出规律:
js
// 初始化100盏灯都是false,表示熄灭的
const lights = Array(100).fill(false)
// 人数100
const personNum = 100
// 每人依次拉一下灯
for (let i = 0; i < personNum; i++) {
for (let j = 1; j < lights.length + 1; j++) {
// // 第一个人把所有灯都打开
// if (i === 0) {
// lights[j - 1] = true
// }
// // 第二个人
// if (i === 1) {
// // 把标号是2的倍数的拉一下
// if (j % 2 === 0) {
// lights[j - 1] = !lights[j - 1]
// }
// }
// // 第三个人
// if (i === 2) {
// // 把标号是3的倍数的拉一下
// if (j % 3 === 0) {
// lights[j - 1] = !lights[j - 1]
// }
// }
// // 第四个人
// if (i === 3) {
// // 把标号是4的倍数的拉一下
// if (j % 4 === 0) {
// lights[j - 1] = !lights[j - 1]
// }
// }
// 以此类推...
if (j % (i + 1) === 0) {
lights[j - 1] = !lights[j - 1]
}
}
}
第一个人(即i === 0)的时候,i + 1 = 1,不管j
是几,任何数对1取余都是0(任何数都能被1整除),条件成立。
然后打印lights
数组看看
找到这里面为true
的下标就好了。
看看评论区,还是有很多答对了的