算法题|-灯泡开关问题

问题描述: 有编号1~100个灯泡,起初所有的灯都是灭的。有100个同学来按灯泡开关,如果灯是亮的,那么按过开关之后,灯会灭掉。如果灯是灭的,按过开关之后灯会亮。
现在开始按开关。
第1个同学,把所有的灯泡开关都按一次(按开关灯的编号: 1,2,3,......100)。
第2个同学,隔一个灯按一次(按开关灯的编号: 2,4,6,......,100)。
第3个同学,隔两个灯按一次(按开关灯的编号: 3,6,9,......,99)。
......
问题是,在第100个同学按过之后,有多少盏灯是亮着的?这些灯的编号是多少?要求给出解题思路或给出伪码。

 

c#代码

static void TurnLights()
        {
            //存放一百个灯的亮灭情况,默认为灭,这里取101是为了从编号1到100 方便数字的处理无其他意义
            bool[] lights = new bool[101];
            //从第1个同学到第100个,依次按灯
            for (int i = 1; i <= 100; i++)
            {
                //从第i个灯开始,隔着i-1个灯按,所以j+=1
                for (int j = i; j <= lights.Length - 1; j += i)
                {
                    //进行取反操作
                    lights[j] = !lights[j];
                }
            }
            
            for (int i = 1; i <= lights.Length-1; i++)
            {
                if (lights[i])
                {
                    //输出亮着的灯编号
                    Console.Write(i+" ");
                }
            }
        }

 

Lua代码

function TurnLights()
    --boolean类型的灯数组
    lights={}

    --i为学生号码,依次从第一个同学到最后一个同学依次按灯
    for i=1,100,1 do
        for j=i,100,i do
            lights[j]=not lights[j]
        end
    end

    for i=1,table.getn(lights),1 do
        if lights[i]==true then
            print(i)
        end
    end
end

TurnLights()

 

 

最终得出的结果是以下编号的灯亮着

1
4
9
16
25
36
49
64
81
100

转载于:https://www.cnblogs.com/wq-KingStrong/p/10267606.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开关量PID控制算法,顾名思义,是将PID(比例-积分-微分)控制原理应用于只有“开”、“关”两种状态的系统中的一种控制策略。在典型的连续PID控制中,PID算法用于调节一个连续变化的过程变量,使之达到期望的目标值。而在开关量PID控制中,该算法的应用场景更为特殊,它主要应用于那些只能处于两个极端状态(例如,开关、阀门、灯泡等)的控制对象。 ### 工作原理概述 在开关量PID控制中,控制器需要依据当前的状态与目标状态之间的差异(通常表现为某种形式的逻辑信号或二进制数据),通过比例、积分和微分三部分来决定下一步操作应该是开启还是关闭某个设备或过程。 1. **比例项(P)**:如果当前状态偏离目标状态的距离很大,那么比例项可能会导致设备立即做出反应,快速切换到打开或关闭状态。这可以快速减少初始的偏差,但可能不太适合保持长期稳定的运行状态。 2. **积分项(I)**:积分项会在一段时间内持续积累偏离情况,因此它可以帮助系统在较短的时间内逐渐适应并纠正持续存在的偏差。然而,在开关量控制中,由于每次操作都意味着设备状态的根本改变,过大的积分作用可能导致频繁的操作,从而影响系统的寿命或是带来额外的能量消耗。 3. **微分项(D)**:微分项考虑到状态的变化速度,有助于预测系统状态的变化趋势。这对于避免突然的、未经预见的系统变化非常有帮助。不过,由于开关量的特性,微分项的实际效果在物理意义上有限,因为它很难反映极快的瞬时变化。 ### 应用实例 - **LED亮度控制**:假设我们需要通过开关量控制调整LED的亮度水平。在这个例子中,“开”代表全亮,“关”代表全暗。控制器可能使用PID算法来调整从全亮到全暗的切换点的位置,以达到预设的亮度水平。 - **水泵启停控制**:在一个水循环系统中,为了维持恒定的压力,可能需要根据传感器测量的实时压力值来决定是否启动或停止水泵。PID控制器在这里可以根据压力的偏差,以及压力变化的趋势,智能地做出决策。 ### 设计和实现挑战 尽管开关量PID控制在原理上类似于传统的PID控制,但是在设计和实现时面临一些独特挑战: - **切换效率**:因为每一次操作都是从一个状态完全跳转到另一个状态,所以控制器需要优化如何在最小化能量损失的情况下完成切换。 - **系统生命周期**:频繁的开关操作可能对硬件造成损耗,因此需要在控制逻辑中加入保护措施,以延长设备的使用寿命。 - **反馈机制**:在物理世界的许多应用中,可能难以直接获取精确的系统状态信息,特别是在只允许两种状态的系统中。因此,设计合理的反馈机制至关重要,以确保控制决策的准确性和稳定性。 总之,开关量PID控制算法提供了一种灵活的方式来管理只支持两种状态的系统,通过巧妙利用比例、积分和微分原则,实现高效、稳定的控制策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值