[C++] 开灯问题(两个思路)

[C++] 开灯问题(两个思路)

两个思路
一个用到数组,从人的角度出发;
一个不用数组,从灯泡的角度出发。

题目

有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输入n和k,输出开着的灯的编号。k≤n≤1000。

样例输入:

7 3

样例输出:

1 5 6 7

第一个思路分析

创建一个a[n]数组,开灯全置1代表灯亮状态,后每次操作(不管开灯还是关灯)时,都对原来元素取非。最后依次判断灯泡状态,输出。

代码实现

int main()
{
    int n, k, i;
    cin>>n>>k;
    int a[n];
    for(i = 0; i < n; i++)   //初始化灯泡
        a[i] = 1;
    for(i = 2; i <= k; i++)
    {
        for(int p = 1; p < n; p++)
        {
            if((p+1) % i == 0)		//操作开关
                a[p] = !a[p];
        }
    }
    for(i = 0; i < n; i++)
    {
        if(a[i])       //判断输出
            cout<<i+1<<" ";
    }
    return 0;
}

第二个思路分析

不用初始化数组,用一个字符m=1表示灯泡开着,然后分别对每一个灯泡操作,比如7个灯泡4个人,那么循环到第2个灯泡,只需要第2个人操作一次,循环到第4个灯泡需要第2个和第4个人总操作两次。在遍历所有从第2个开始的所有人后,判断灯泡状态。

代码实现

int main()
{
    int n, k, m = 1;
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
    {
        for(int p = 2; p <= k; p++)
        {
            if(i % p == 0 )    //操作灯泡
                m = !m;
        }
        if(m)				//判断输出
            cout<<i;
        m = 1;
    }
    return 0;
}
两个按键模拟汽车转向的基本思路是创建一个简单的交互界面。通常,一个按键代表左转信号,另一个代表右转信号。以下是基本流程: 1. **硬件连接**:将两个按键分别连接至电路板上的输入引脚,可以使用数字输入方式,例如GPIO端口。 2. **初始化**:在程序开始时,初始化这两个按键的状态为非按下的(通常为高阻抗),并设置适当的中断函数来监听按键按下和释放事件。 3. **按键中断**:当按键按下时,中断服务程序会被触发。这个函数会识别是哪一个按键被按下,并根据按键的不同设置相应的转向状态(通常是开关或者改变的颜色)。 4. **转向控制**:对于每个按键,可以有一个变量表示当前的状态(如左右转)。按下时,更改该变量,然后激活对应方向的LED。例如,左转键按下时,点亮左转;右转键按下时,点亮右转。 5. **延时与反馈**:为了模拟真实的操作过程,可以设置短暂的延迟时间,让用户有时间确认按键动作。释放按键后,需要让熄灭,等待一段时间再允许再次操作。 6. **异常处理**:防止长时间连续按下按键造成持续闪烁,可以设定单次操作的时间限制或者在按键释放后自动复位的状态。 示例代码(假设用Arduino平台): ```c++ void setup() { pinMode(leftBtnPin, INPUT_PULLUP); pinMode(rightBtnPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(leftBtnPin), leftTurn, FALLING); attachInterrupt(digitalPinToInterrupt(rightBtnPin), rightTurn, FALLING); } void loop() {} void leftTurn() { if (!isPressed(leftBtnPin)) { // 判断按键是否已释放 digitalWrite(leftLightPin, HIGH); delay(500); // 开灯500毫秒 digitalWrite(leftLightPin, LOW); delay(200); // 关200毫秒 } } void rightTurn() { if (!isPressed(rightBtnPin)) { digitalWrite(rightLightPin, HIGH); delay(500); digitalWrite(rightLightPin, LOW); delay(200); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值