一、题目
有一长方形,长为 343720 单位长度,宽为 233333 单位长度。在其内部左上角顶点有一小球(无视其体积),其初速度如图所示且保持运动速率不变,分解到长宽两个方向上的速率之比为 dx:dy = 15:17。小球碰到长方形的边框时会发生反弹,每次反弹的入射角与反射角相等,因此小球会改变方向且保持速率不变(如果小球刚好射向角落,则按入射方向原路返回)。从小球出发到其第一次回到左上角顶点这段时间里,小球运动的路程为多少单位长度?答案四舍五入保留两位小数。
答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个小数,在提交答案时只填写这个小数,填写多余的内容将无法得分。
二、思路
是看别人的代码的解题思路,我们从初始位置发射这个速率,会在长和宽上都会反弹,我们可以利用两次for循环来找出在长和宽上反弹的次数,再通过次数分别算出长和宽总的路程,看其之比是否是15:17;如果是,利用勾股定理,算出斜边。
计算长方形长边的两倍长度, 因为小球在长边反弹时,每次走过的路程是长边长度的两倍, 计算长方形宽边的两倍长度, 因为小球在宽边反弹时,每次走过的路程是长边长度的两倍。
三、代码
#include<iostream>
#include<cmath>
typedef long long LL;//定义一个类型别名,因为我们计算下来数可能非常大
// ,我们在很多地方都要用到long long ,也方便简化代码
//长为 343720 单位长度,宽为 233333 单位长度
int main(){//一次反弹所对应的长边的距离 LL lengthDouble = 2*343720;//一次反弹所对应的宽边的距离 LL widthDouble = 2*233333;for(LL i = 1; i < 10000; i++){for(LL j = 1; j < 10000; j++){//(lengthDouble*i)/t 15//_______________________ = _______时间我们可以约掉 ,看水平路程和垂直路程是否是15:17 //(widthDouble*j)/t 17if(lengthDouble*i*17 == widthDouble*j*15){std::cout.precision(2);std::cout<<std::fixed<<std::sqrt((lengthDouble*i)*(lengthDouble*i) + (widthDouble*j)*(widthDouble*j));return 0; //1100325199.77}}}return 0;
}
四、反思
有几个问题
-
#include<cmath>和#include<math.h>有什么区别:
cmath
里的函数和符号都被放置在std
命名空间中,是C++的 -
要会使用定义类型别名的使用方法typedef long long LL;
-
for循环的初始条件是从一开始的,如果是0,也就没有反弹,肯定不会满足15:17的速率比,
-
确定精度cout.precision(2)注意:这里是.
-
固定点表示法cout::fixed注意:这里是::
-
第一个return 0,是找到合适的解提前结束循环
-
第二个return 0,是遍历所有可能的结果后结束循环