林若音 2023-05-27 20:15 采纳率: 100%
浏览 103
已结题

C语言红绿灯时间问题

img

红绿灯先变绿a秒,再变红b秒,然后再变绿a秒,变红b秒,不断循环,小Q在红绿灯刚刚变绿的时候开始观察,持续了c秒
请求出在这c秒中有多少时间红绿灯是绿的

  • 写回答

6条回答 默认 最新

  • 关注
    
    #include <stdio.h>
    
    int main() {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c); // 读取 a、b、c 参数
        int cycle = a + b; // 红绿灯一个循环的总时间
        int green = 0; // 红绿灯绿色显示的总时间
        int t = c; // 计时器
        while (t > 0) {
            if (t >= a) { // 如果剩余的时间大于绿灯时间 a,那么绿灯全部亮起
                green += a;
                t -= a;
            } else { // 否则只有剩余的时间全部是绿灯时间
                green += t;
                t = 0;
            }
            if (t >= b) { // 如果剩余的时间大于红灯时间 b,那么红灯全部亮起
                t -= b;
            } else { // 否则只有剩余的时间全部是红灯时间
                t = 0;
            }
        }
        printf("%d\n", green); // 输出绿灯的总时间
        return 0;
    }
    

    上面这段代码中,我们首先通过 scanf 函数读取三个参数 a、b 和 c,然后计算出一个完整的红绿灯循环的时间 cycle。
     
    接着,我们对于每个循环,分别判断剩余时间是否大于绿灯时间 a,如果大于则绿灯全部亮起,绿灯时间加上 a,计时器减去 a;否则只有剩余时间全部是绿灯时间。
     
    然后我们再判断剩余的时间是否大于红灯时间 b,如果大于则红灯全部亮起,红灯时间为 b,计时器再减去 b。因为 c 不一定是一个完整的循环时间,因此我们需要循环判断,直到剩余时间不够执行下一个循环。最终,我们输出绿灯的总时间即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • uyoj661 2023-05-27 20:27
    关注
    
    #include<iostream>
    using namespace std;
    int main(){
     int a,b,c,x;
    cin>>a>>b>>c;
    if(c%(a+b)<=a)
    x=a*(c/(a+b))+c%(a+b);
    else
    x=a*(c/(a+b))+a;
    cout<<x;
    return 0;
    }
    
    评论
  • 朱恩泽 2023-05-27 20:52
    关注
    
    #include<iostream>
    using namespace std;
    int main() 
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        int cnt = c / (a+b);
        int times = cnt * a;
        if (c % (a+b) > 0)
        {
            times += (c % (a+b)) > a ? a : (c % (a+b));
        }
        printf("%d", times);
        return 0;
    }
    
    评论
  • Minuw 2023-05-27 20:48
    关注
    
    #include <iostream>
    
    using namespace std;
    
    int main() {
        int a, b, c;
        cin >> a >> b >> c;
    
        int cycle_time = a + b;
        int green_time = 0;
    
        // 计算绿灯亮的总时间
        if (c >= a) {
            int num_cycles = (c - a) / cycle_time + 1;
            green_time = num_cycles * a;
            if (c >= a + num_cycles * cycle_time - b) {
                green_time += c - (a + num_cycles * cycle_time - b);
            }
        } else {
            green_time = c;
        }
    
        cout << green_time << endl;
    
        return 0;
    }
    首先读入输入的 a、b、c 值,然后计算出红绿灯变化的周期时间 cycle_time,以及绿灯亮的总时间 green_time。
    
    如果观察时间 c 大于等于第一个绿灯亮的时间 a,那么红绿灯会在这个时间段内多次变化。我们计算出这个时间段内完整的周期数 num_cycles,然后用这个数乘以每个周期中绿灯亮的时间 a 得到绿灯亮的总时间。此外,如果观察时间 c 超过了最后一个绿灯变成红灯的时间,那么我们还需要加上这段时间内绿灯亮的时间。最后,如果观察时间 c 小于第一个绿灯亮的时间 a,那么绿灯亮的总时间就是 c。
    
    最后输出绿灯亮的总时间即可。
    
    
    
    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-05-27 22:21
    关注
    评论
  • 瞬间动力 2023-05-27 22:37
    关注

    首先我们需要知道,一个红绿灯变换的周期为 a+b 秒,其中 a 为绿灯持续时间,b 为红灯持续时间。另外,假设小Q在一个周期内的第 x 秒时开始观察,那么在他观察的这个时刻,红绿灯的状态如下:

    • 如果 x < a,则红绿灯为绿灯,因为此时绿灯还没有变成红灯;
    • 如果 a ≤ x < a+b,则红绿灯为红灯,因为此时绿灯已经变成了红灯;
    • 如果 x ≥ a+b,则红绿灯为绿灯,因为此时红灯已经持续了 b 秒,又回到了绿灯状态。

    根据上述规律,我们可以计算出小Q在观察过程中所处每个周期内红绿灯为绿灯的总时间 t1,以及在最后一个不完整周期内红绿灯为绿灯的时间 t2。则小Q所处的 c 秒内,红绿灯为绿灯的总时间为:

    t = t1 + t2

    其中 t1 等于一个周期的长度 a+b 减去 b 秒(去掉红灯持续时间)再乘以观察的周期数,即:

    t1 = floor(c / (a+b)) * (a+b) - b

    其中 floor() 函数表示向下取整。而 t2 则等于最后一个不完整周期内红绿灯为绿灯的时间,即:

    t2 = min(c - floor(c / (a+b)) * (a+b), a)

    因此,小Q所处 c 秒内,红绿灯为绿灯的总时间为:

    t = t1 + t2 = floor(c / (a+b)) * (a+b) - b + min(c - floor(c / (a+b)) * (a+b), a)

    这就是小Q所处 c 秒内,红绿灯为绿灯的总时间。

    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 已采纳回答 5月28日
  • 创建了问题 5月27日

悬赏问题

  • ¥15 在工控机(Ubuntu系统)上外接USB蓝牙硬件进行蓝牙通信
  • ¥15 关于PROCEDURE和FUNCTION的问题
  • ¥100 webapi的部署(标签-服务器)
  • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)
  • ¥15 C语言除0问题的检测方法
  • ¥15 为什么四分管的内径有的是16mm有的15mm,四分不应该是12.7mm吗
  • ¥15 macos13下 ios交叉编译的问题
  • ¥15 bgz压缩文件怎么打开
  • ¥15 封装dll(引入了pcl的点云设计库)
  • ¥30 关于#开发语言#的问题:我需要在抄板的基础上再抄板抄程序,根据RDA8851CM基础上开发