赞
踩
目录
【代码实现】
【数据溢出】
【解决问题】
有一长方形,长为 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;
思路已经明确,我们将其转化为计算机语言,我们需要求的是路程,其为水平和竖直路程勾股定理求出,联立的关键在于速度的比例,也就是水平和竖直路程的比例是定值
联立得到 整理得
我们求第一次回到起始点即求k的最小值,k为整数,我们将k中较小的另为2,则可以表示出当k最小时候他们对应的数值,首先将前面的系数15b/17a 化简,同时除以其最大公因子,则我们可以得到k(1)=m*k(2) m为整数,则k的最小值即可求出,比如当m=2时,另较小的k2为2,则k1为4,则可进而求出水平竖直位移进而求出总位移。
理论成立,实践开始!!(滑稽)
【代码实现】
-
- #include<stdio.h>
- int main()
- {
- int a, b;
- a = 233333;
- b = 343720;//将长方形宽赋值给ab
- int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
- fenzi = 15 * b;
- fenmu = 17 * a;
- //第二步求出最大公约数;
- int ins;//定义因子
- for (int i = 1; i <= fenzi; i++)
- {
- if (fenzi % i == 0 && fenmu % i == 0)
- {
- ins = i;
- }
- }
- fenzi = fenzi / ins;
- fenmu = fenmu / ins;
- printf("%d %d", fenzi, fenmu);
- }
-
-
根据上述代码我们可以得出化简后m=1059/1768,所以当k都为整数的时候k1=1059,k2=1768,
但我们求的k为偶数所以乘2.则k1=2118,k2=3536.
接下来求对应路程,sx=k1*a; sy=k2*b; 然后勾股定理求出s总
【数据溢出】
但值得注意的是如果用一般的式子,再算勾股定理的时候数据会超出范围,数据溢出产生误差,正如下面这样计算
- #include<stdio.h>
- #include<math.h>
- int main()
- {
- int a, b;
- a = 343720;
- b = 233333;//将长方形宽赋值给ab
- int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
- fenzi = 15 * b;
- fenmu = 17 * a;
- //第二步求出最大公约数;
- int ins;//定义因子
- for (int i = 1; i <= fenzi; i++)
- {
- if (fenzi % i == 0 && fenmu % i == 0)
- {
- ins = i;
- }
- }
- fenzi = fenzi / ins;
- fenmu = fenmu / ins;//求出对应的k
- fenzi=2*fenzi;
- fenmu=2*fenmu;//此时k即为最小偶数;
- printf("%d %d \n",fenzi,fenmu);
- int sx,sy;
- sx=fenzi*a;
- sy=fenmu*b;
- printf("%d %d \n",sx,sy);
- double s;
- s=sqrt(sx*sx+sy*sy);
- printf("%.2lf\n", s);
- }
结果如下我们发现上述s计算发生数据溢出,若我们第一时间想讲s的定义改为long double ,来增大其数据范围,但sqrt的输出为double,数据形式不同最后输出为0.00,
【解决问题】
为解决这一问题我们需用中间数据来存储解决数据溢出,我们知道x,y的比例为15:17;
则我们将其分别除15:17;分为若干等分,存储在t中(则x为15t,y为17t),在将t带入进行计算即可,代码为
- #include<stdio.h>
- #include<math.h>
- int main()
- {
- int a, b;
- a = 343720;
- b = 233333;//将长方形宽赋值给ab
- int fenzi, fenmu;//根据刚才的分析分子为15b,分母为17a;
- fenzi = 15 * b;
- fenmu = 17 * a;
- //第二步求出最大公约数;
- int ins;//定义因子
- for (int i = 1; i <= fenzi; i++)
- {
- if (fenzi % i == 0 && fenmu % i == 0)
- {
- ins = i;
- }
- }
- fenzi = fenzi / ins;
- fenmu = fenmu / ins;//求出对应的k
- fenzi = 2 * fenzi;
- fenmu = 2 * fenmu;//此时k即为最小偶数;
- printf("%d %d \n", fenzi, fenmu);
- int sx, sy;
- sx = fenzi * a;
- sy = fenmu * b;
- printf("%d %d \n", sx, sy);
- double t=sx/15;
- double s=sqrt((15*t)*(15*t)+(17*t)*(17*t));
- printf("%.2f",s);
- }
输出为OK,以上即为B题的全部解析及思路,后续题目关注动态,新人求三连!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。