用编程的思路解决李永乐老师出的数学题

今天刷今日头条,看到李永乐老师除了一道数学题,题目如下图:

毕业多年,数学早已忘得一干二净了,那就用编程思路解一下吧。

分析题目

读完整段文字,我们可以得出两个前置条件:

  • 100盏灯,分别标号1,2,3,4,....,99,100
  • 100个人

什么动作呢?就是这100个人依次对这100盏灯进行开关操作。

从题目得知,这100盏灯默认都是熄灭状态的

  • 第一个人把所有灯拉一下,这时候就都亮了
  • 第二个人把2的倍数的灯拉一下,这时所有2的倍数的都熄灭了
  • 第三个人把3的倍数的灯再拉一下
  • 第四个人把4的倍数的灯再拉一下
  • 依次类推...
  • 第100个人把100的倍数的灯再拉一下(当然这个说的就是第100盏灯)

题目问到最后有哪些灯是亮的。

代码思路

  1. 初始化一个长度100的数组,表示100盏灯,每项为布尔值false,因为灯要么开要么关false表示关灯,true表示开灯。
  2. 把这个数组遍历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的下标就好了。

看看评论区,还是有很多答对了的

相关推荐
memcpy03 分钟前
LeetCode 2452. 距离字典两次编辑以内的单词【暴力;字典树】中等
算法·leetcode·职场和发展
王老师青少年编程31 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog12332 分钟前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
AI科技星40 分钟前
灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
晓觉儿42 分钟前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论
We་ct1 小时前
LeetCode 322. 零钱兑换:动态规划入门实战
前端·算法·leetcode·typescript·动态规划
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 394. 字符串解码 | C++ 单栈回压法
c++·算法·leetcode
穿条秋裤到处跑2 小时前
每日一道leetcode(2026.04.22):距离字典两次编辑以内的单词
算法·leetcode
淘矿人2 小时前
Claude辅助算法设计与优化
人工智能·python·算法·microsoft·github·bug·pygame
流年如夢2 小时前
自定义类型进阶:联合与枚举
java·c语言·开发语言·数据结构·数据库·c++·算法