当前位置:   article > 正文

2024蓝桥杯B组B题思路详解_有一长方形,长为343720 单位长度,宽为233333 单位长度。在其内部左 上角顶点有一

有一长方形,长为343720 单位长度,宽为233333 单位长度。在其内部左 上角顶点有一

 

目录

 

小球反弹(结果填空)

【问题描述】 

【思路讲解】

【代码实现】

【数据溢出】

【解决问题】

小球反弹(结果填空)

【问题描述】

有一长方形,长为 343720 单位长度,宽为 233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所示且保持运动速率不变,分解到长宽两个方向上的速率之比为dx:dy=15:17。小球碰到长方形的边框时会发生反弹,每次反弹的入射角与反射角相等,因此小球会改变方向且保持速率不变(如果小球刚好射向角落,则按入射方向原路返回)。从小球出发到其第一次回到左上角顶点这段时间里,小球运动的路程为多少单位长度?答案四舍五入保留两位小数

_____。

 【思路讲解】

此题中小球要回到出发点,则其水平和竖直路程必须为水平长度和竖直长度的偶数倍,举例拆解来看

例如,将速度和位移分解成水平和竖直方向,在水平方向第一次回到出发点,则其路程应为两倍长方形的长度,第二次则为四倍,以此类推,想要回到出发点必须为边长的偶数倍,同理竖直方向也一样。

则s(x)=2k(1)*343720;  s(y)=2k(2)*233333;

同时,根据题目速度满足dx:dy=15:17。则两式联力即可求解。

为了后续理解方便,我们将长方形边长设为a(长),b(宽)

s(x)=2k(1)*a;   s(y)=2k(2)*b;

思路已经明确,我们将其转化为计算机语言,我们需要求的是路程,其为水平和竖直路程勾股定理求出,联立的关键在于速度的比例,也就是水平和竖直路程的比例是定值

联立得到     \frac{k(1)}{k(2)}=\frac{15b}{17a}      整理得    k(1)=\frac{15b}{17a}k(2)

我们求第一次回到起始点即求k的最小值,k为整数,我们将k中较小的另为2,则可以表示出当k最小时候他们对应的数值,首先将前面的系数15b/17a  化简,同时除以其最大公因子,则我们可以得到k(1)=m*k(2)  m为整数,则k的最小值即可求出,比如当m=2时,另较小的k2为2,则k1为4,则可进而求出水平竖直位移进而求出总位移。

理论成立,实践开始!!(滑稽)

【代码实现】

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a, b;
  5. a = 233333;
  6. b = 343720;//将长方形宽赋值给ab
  7. int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
  8. fenzi = 15 * b;
  9. fenmu = 17 * a;
  10. //第二步求出最大公约数;
  11. int ins;//定义因子
  12. for (int i = 1; i <= fenzi; i++)
  13. {
  14. if (fenzi % i == 0 && fenmu % i == 0)
  15. {
  16. ins = i;
  17. }
  18. }
  19. fenzi = fenzi / ins;
  20. fenmu = fenmu / ins;
  21. printf("%d %d", fenzi, fenmu);
  22. }

根据上述代码我们可以得出化简后m=1059/1768,所以当k都为整数的时候k1=1059,k2=1768,

但我们求的k为偶数所以乘2.则k1=2118,k2=3536.

接下来求对应路程,sx=k1*a;  sy=k2*b;  然后勾股定理求出s总

【数据溢出】

但值得注意的是如果用一般的式子,再算勾股定理的时候数据会超出范围,数据溢出产生误差,正如下面这样计算

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int a, b;
  6. a = 343720;
  7. b = 233333;//将长方形宽赋值给ab
  8. int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
  9. fenzi = 15 * b;
  10. fenmu = 17 * a;
  11. //第二步求出最大公约数;
  12. int ins;//定义因子
  13. for (int i = 1; i <= fenzi; i++)
  14. {
  15. if (fenzi % i == 0 && fenmu % i == 0)
  16. {
  17. ins = i;
  18. }
  19. }
  20. fenzi = fenzi / ins;
  21. fenmu = fenmu / ins;//求出对应的k
  22. fenzi=2*fenzi;
  23. fenmu=2*fenmu;//此时k即为最小偶数;
  24. printf("%d %d \n",fenzi,fenmu);
  25. int sx,sy;
  26. sx=fenzi*a;
  27. sy=fenmu*b;
  28. printf("%d %d \n",sx,sy);
  29. double s;
  30. s=sqrt(sx*sx+sy*sy);
  31. printf("%.2lf\n", s);
  32. }

结果如下我们发现上述s计算发生数据溢出,若我们第一时间想讲s的定义改为long double ,来增大其数据范围,但sqrt的输出为double,数据形式不同最后输出为0.00,

【解决问题】

为解决这一问题我们需用中间数据来存储解决数据溢出,我们知道x,y的比例为15:17;

则我们将其分别除15:17;分为若干等分,存储在t中(则x为15t,y为17t),在将t带入进行计算即可,代码为

  1. #include<stdio.h>
  2. #include<math.h>
  3. int main()
  4. {
  5. int a, b;
  6. a = 343720;
  7. b = 233333;//将长方形宽赋值给ab
  8. int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
  9. fenzi = 15 * b;
  10. fenmu = 17 * a;
  11. //第二步求出最大公约数;
  12. int ins;//定义因子
  13. for (int i = 1; i <= fenzi; i++)
  14. {
  15. if (fenzi % i == 0 && fenmu % i == 0)
  16. {
  17. ins = i;
  18. }
  19. }
  20. fenzi = fenzi / ins;
  21. fenmu = fenmu / ins;//求出对应的k
  22. fenzi = 2 * fenzi;
  23. fenmu = 2 * fenmu;//此时k即为最小偶数;
  24. printf("%d %d \n", fenzi, fenmu);
  25. int sx, sy;
  26. sx = fenzi * a;
  27. sy = fenmu * b;
  28. printf("%d %d \n", sx, sy);
  29. double t=sx/15;
  30. double s=sqrt((15*t)*(15*t)+(17*t)*(17*t));
  31. printf("%.2f",s);
  32. }

输出为OK,以上即为B题的全部解析及思路,后续题目关注动态,新人求三连!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/705703
推荐阅读
相关标签
  

闽ICP备14008679号