交和并的一个精秒体现思想

比如一个问题如下:

    甲乙丙丁四人同时开始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次,丙每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函数fun的功能是根据形参提供的值,求出总共听到多少次鞭炮声作为函数值返回。注意,当几个鞭炮同时炸响,只算一次响声,第一次响声是在第0秒。例如,若t1=7,t2=5,t3=6,t4=4,n=10,则总共可听到28次鞭炮声。该怎么办呢?

    很明显,是一个交和并的问题。显示t1最长,也就是说在在同样响10次的情况下,甲最少要70秒。那我们就在70秒内统计一共响了多少次。也就是求每个人响了的次数之和减去同时响的次数。这种思路也是可行的,但是要求每两个人间共同响的次数,很烦的。有没有好一点和思路呢?

    我们可以将他们同时响的次数算作一次就好了。

    程序如下:

#include "stdio.h"
#define OK(i,t,n) ((i%t==0)&&(i/t<n))  //巧秒之处
int fun(int t1,int t2,int t3,int t4,int n)
{
int count,t,maxt=t1;
if(maxt<t2) maxt=t2;
if(maxt<t3) maxt=t3;
if(maxt<t4) maxt=t4;   //先得求出最长时间才行
count=0;
for(t=1;t<maxt*n;t++)
    {if(OK(t,t1,n)||OK(t,t2,n)||OK(t,t3,n)||OK(t,t4,n))//只要是同时响,就算一次,不管是两个同时响

                                                       //还是三个、四个同时响
        count++;
    }
    return count;
}
int main()
{
int t1=7,t2=5,t3=6,t4=4,n=10,r;
r=fun(t1,t2,t3,t4,n);
printf("%d\n",r);
}

1、本程序本身并没有什么难的,只是在处理交并时巧秒的思路值的我们思考和学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值