C语言【程序17】 题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

//【程序17】
//题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;
//再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?  ==>299.609375 0.097656  

#include<stdio.h> 
int main()
{
	float sum=100,high=100;
	for(int i=1;i<10;i++)
	{
		high=high/2;
		sum+=2*high;
	}
	printf("%f %f",sum,high/2); //note:第10次落地"后"再反弹起来的
	return 0; 
}
//            共   高度 
// 第一次落地 100  100 
//            200  50
//            250  25
//            275  12.5 
<think>题目一球100高度自由落下每次落地回原高度一半;再落下它在第10落地经过多少?第10反弹? 分析: 设初始高度为h0 = 100。 第1落地经过路程 = 100(第一下落) 第1反弹高度:h1 = h0/2 = 50 第2落地经过路程 = 第一下落100 + 第一反弹上升50 + 第二下落50 = 100+50+50=200 但是注意,第2落地,球经历了两下落和一上升(在第一落地后上升,然后第二下落)。 更一般地: 第1落地:路程s1 = h0 第2落地:s2 = h0 + 2*(h0/2) = h0 + h0 第3落地:s3 = h0 + h0 + 2*(h0/4) = h0 + h0 + h0/2 实际上,从第2落地开始,每次落地增加的路程都是上一反弹高度的2倍(因为反弹和下落两个过程,且高度相等)。 因此,我们可以这样计算: 第1落地经过路程 = h0 第2落地经过路程 = h0 + 2*(h0/2) = h0 + h0 第3落地经过路程 = h0 + 2*(h0/2) + 2*(h0/4) = h0 + h0 + h0/2 第n落地经过路程 = h0 + 2*(h0/2) + 2*(h0/4) + ... + 2*(h0/(2^(n-1))) [注意:最后一项是第n-1反弹高度] 但是注意,这个式子中,从第1落地到第n落地,实际上有n-1反弹和下落(除了第一只有下落)。 所以,总路程 = h0 + 2 * (h0/2 + h0/4 + ... + h0/(2^(n-1))) 化简:总路程 = h0 + 2 * h0 * (1/2 + 1/4 + ... + 1/(2^(n-1))) = h0 + 2 * h0 * ( (1/2)*(1 - (1/2)^(n-1)) / (1-1/2) ) [等比数列和] = h0 + 2 * h0 * (1 - 1/(2^(n-1))) = h0 + 2*h0 - 2*h0/(2^(n-1)) = 3*h0 - h0/(2^(n-2)) 但是,我们也可以用一个循环来计算,避免复杂的公式。 另外,第10反弹高度是指第10落地后弹起的高度,也就是第10落地后,球会反弹,此高度是h0/(2^10) 因此,我们可以用循环来计算总路程,并计算第10反弹高度。 步骤: 1. 初始化:高度h=100,总路程s=0。 2. 第一下落:s = h (即100) 3. 然后进行9循环(因为从第2落地到第10落地,需要9反弹和下落,每次反弹高度是上一一半,并且每次反弹和下落的路程是反弹高度的两倍) 注意:第10落地,我们已经经历了10下落和9上升(除了第一下落没有上升)。 另一种思路: 第1下落:100落地反弹50(然后上升50,再下落50,完成第二落地) 所以,我们可以这样循环: s = 0 h = 100 s = s + h // 第一下落 for (i=1; i<10; i++) // 循环9,因为第1落地已经计算,后面还有9落地(第2到第10) { h = h / 2; // 反弹高度变为原来的一半(第i反弹高度) s = s + 2 * h; // 反弹和下落,所以是两倍 } 这样,循环结束后,s就是第10落地经过的总路程。 第10反弹高度:h/2 (因为第10落地反弹,所以再除以2就是第10反弹高度?) 但是注意:循环中的h在每次循环开始被除以2,循环9后,h变为100/(2^9)=100/512,这个h实际上是第10落地前的反弹高度(也就是第9反弹高度)?不对。 我们重新梳理: 初始:h=100 第一下落:100(第一落地),然后反弹高度为50(即h1=50) 第二下落:50(然后第二落地),然后反弹25(h2=25) 所以,第n反弹高度 = 100/(2^n) 在循环中: 第一循环(i=1): h = h/2 => h=50 (这是第一反弹高度,也是第二下落的高度) s = s + 2*h => 100 + 2*50 = 200 (此是第二落地的总路程) 第二循环(i=2): h = 50/2 = 25 s = 200 + 2*25 = 250 (第三落地的总路程) 第三循环(i=3): h = 25/2 = 12.5 s = 250 + 2*12.5 = 275 ... 第9循环(i=9): h = 100/(2^9) = 100/512 ≈ 0.1953125 s = s + 2*h (此是第10落地的总路程) 注意:循环9后,我们计算了第2到第10落地9)的额外路程(每次包括一上升和一下落,即2*h),所以总路程s就是第10落地的总路程。 而第10反弹高度:应该是第10落地反弹高度,即第10反弹高度 = 当前h(循环9后的h)再除以2?不对,因为循环9后的h是第10落地前的那反弹高度(也就是第9反弹高度)?不对,实际上: 第1反弹高度:h1 = 100/2 = 50 (在第1落地反弹) 第2反弹高度:h2 = 50/2 = 25 (在第2落地反弹) ... 第10反弹高度:h10 = 100/(2^10) = 100/1024 所以,在循环结束后,第10反弹高度 = h/2 (因为循环9后,h=100/(2^9)=100/512,那么第10反弹高度就是h/2=100/1024) 但是,我们也可以直接计算:h10 = 100 / pow(2,10) 因此,程序可以这样写: 方法一:循环计算 double s = 100.0; // 第一下落 double h = 100.0; // 初始高度 for (int i=1; i<10; i++) { // 循环9,处理第2到第10落地 h = h / 2; // 反弹高度(也就是下一下落的高度) s = s + 2 * h; // 加上反弹和下落的路程(两经过h高度) } // 此s是第10落地的总路程 // 第10反弹高度 = h / 2 (因为第10落地后,球会反弹到h/2的高度) 方法二:直接计算第10反弹高度:h10 = 100.0 / pow(2,10) 注意:题目10落地的总路程和第10反弹高度(即第10落地后弹起的高度)。 因此,我们输出: 第10落地经过s10反弹高度为h10 = h/2 (或者100.0/1024) 但是,我们也可以不通过循环计算反弹高度,而是直接计算。 下面我们用循环实现,并输出结果。 注意:题目用C语言。 代码:</think>以下是用C语言解决自由落体球问题的代码实现: ```c #include <stdio.h> int main() { double height = 100.0; // 初始高度100 double distance = 0.0; // 总路程 double bounce_height; // 反弹高度 // 第一下落 distance += height; // 循环计算9反弹和下落(第2到第10落地) for (int i = 1; i < 10; i++) { height /= 2; // 反弹高度减半 distance += 2 * height; // 加上反弹和下落的路程 } bounce_height = height / 2; // 第10反弹高度 printf("第10落地经过: %.6f \n", distance); printf("第10反弹高度: %.8f \n", bounce_height); return 0; } ``` ### 代码说明: 1. **物理过程模拟**: - 第一下落:100(直接加到总路程) - 后续9过程:每次包含反弹和下落两个阶段(各为当前高度一半) - 第10反弹高度:第10落地后弹起的高度 2. **计算结果**: - 总路程 = 100 + 2×(50 + 25 + 12.5 + ... + 第9高度) - 第10反弹高度 = 第10落地高度 / 2 3. **输出格式**: - 总路程保留6位小数(精确到毫) - 反弹高度保留8位小数(精确到微) ### 运行结果: ``` 第10落地经过: 299.609375 10反弹高度: 0.09765625 ``` ### 数学验证: 总路程公式: $S = h + 2 \times h \times \sum_{n=1}^{9} \frac{1}{2^n} = 100 + 2 \times 100 \times (0.5 + 0.25 + ... + 0.001953125) = 299.609375$10反弹高度: $H_{10} = \frac{100}{2^{10}} = \frac{100}{1024} = 0.09765625$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值