uva 10387 Billiard (基础数学问题.平面反射)

"题意:给出一个台球台子的长和宽a、b,球每次从球台的中间位置开始运动,球运动时间s秒后回到原出发点,给出了球在球台的长和宽上反弹的次数,要求出球的初速度和开始时的发射角度;

思路:由于最后回到出发点,所以根据小球与长和宽碰撞的次数能求出小球在平行与长边和垂直于长边上的距离两个距离的比值就是要求角度的正切值速度就是用小球走过的距离除以时间;"

应该先画出图来,就会发现无论小球如何反弹,其与水平方向的夹角是不变的,这个夹角即是我们要求的发射角度;

因为能回到原点,所以每碰撞一次,实际上小球都是在该方向上走了边长的距离。但实际上小球走的路径其实是一条直线(因为其运动方向与水平方向的夹角始终不变),所以我们可以根据勾股定理求出小球的路程;

至于速度,自然用路程除以时间即可;

下面代码中用到了math.h中的几个函数,在代码中有详细的说明:

#include<stdio.h>
#include<math.h>
int main()
{
    double a,b,s,m,n;
    double sum_h,sum_v,angle;
    //在math.h中,关于角度全是用弧度表示而不是角度表示,输出中明显是角度,所以要有一步转化;
    const double lll=asin(1.0)/90;//这里是求出1角度相当于多少弧度;
    double v;
    while(scanf("%lf%lf%lf%lf%lf",&a,&b,&s,&m,&n)!=EOF&&(a||b||s||m||n))
    {
        sum_h=m*a;
        sum_v=n*b;
        angle=atan(sum_v/sum_h);//反三角函数反正切用于求弧度;
        v=hypot(sum_h,sum_v);//此函数用于已知直角三角形两直角边求斜边长度;
        printf("%.2lf %.2lf\n",angle/lll,v/s);//这个地方用angle/lll是将弧度转化为角度;
    }
    return 0;
}

记住这种题型的处理方法。

你可能感兴趣的:(数学,uva,math.h)