愛在花開的季節 发表于 2025-4-7 13:11:20

15届蓝桥杯c/c++b组试题B:小球反弹

标题概述:

https://i-blog.csdnimg.cn/direct/a1ee6a3c2ace4d83a0d518d294109b02.png
思绪讲解:

        在知道速度的前提下,我们可以求解时间t来盘算旅程s=v*t。那么时间怎么求?
        因速度分解为dx和dy,那么我们将视角转换到x和y方向上,假设在x方向上一共运动了p次来回,y方向上运动了q次来回,那么就偶然间t,使得
                                x方向上: t * dx = 2 * x * p                (x为长)
                                y方向上: t * dy = 2 * y * q                (y为高)
        我们将两式进行除法运算:
                                y * dx/ x * dy = p / q
        得到了p和q的关系比例,既得到在x和y方向来回次数的比值,因为小球大概多次回到起点,(在不约分的环境下)那么这个p和q存在一个最大公约数g,这个最大公约数就是小球回到起点的次数。标题要求第一次回到起点,既将p和q除去最大公约数g,得到第一次回到起点时,在x和y方向上来回的次数p和q。
        得到次数后,使用上述公式算出时间t,末了旅程s = sqrt(dx*dx+dy*dy)* t。留意末了效果保存俩位小数。
代码:

我这里用的是dev-c++
#include<iostream>
#include<cmath>
using namespace std;
int gcd(int a, int b){
        return b == 0 ? a : gcd(b,a%b);
}
int main(){
        int x = 343720;
        int y = 233333;
        int dx = 15;
        int dy = 17;
        int p = y * dx;
        int q = x * dy;
        int g = gcd(p,q);
        p /= g;
        q /= g;
        int t = 2*x*p / dx;
        double s = 1.0 * sqrt(dx*dx+dy*dy)*t;
        printf("%.2f",s);
        return 0;
}



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 15届蓝桥杯c/c++b组试题B:小球反弹