蓝桥杯省赛真题C++B组-小球反弹

一、题目

有一长方形,长为 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       17
			if(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; 
} 

四、反思

有几个问题

  1. #include<cmath>和#include<math.h>有什么区别:cmath 里的函数和符号都被放置在 std 命名空间中,是C++的

  2. 要会使用定义类型别名的使用方法typedef long long LL;

  3. for循环的初始条件是从一开始的,如果是0,也就没有反弹,肯定不会满足15:17的速率比,

  4. 确定精度cout.precision(2)注意:这里是.

  5. 固定点表示法cout::fixed注意:这里是::

  6. 第一个return 0,是找到合适的解提前结束循环

  7. 第二个return 0,是遍历所有可能的结果后结束循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值