【题目链接】
ybt 1085:球弹跳高度的计算 OpenJudge NOI 1.5 20:球弹跳高度的计算
【题目考点】
1. 循环
【解题思路】
1. 使用循环描述球的弹跳过程
2. 数学计算
分析各次落地前弹跳的距离 设球的初始高度是
h
h
h
第1次下落
h
h
h,第1次落地,第1次反弹
h
2
\frac{h}{2}
2h第2次下落
h
2
\frac{h}{2}
2h,第2次落地,第2次反弹
h
4
\frac{h}{4}
4h第3次下落
h
4
\frac{h}{4}
4h,第3次落地,第3次反弹
h
8
\frac{h}{8}
8h …第i次下落
h
2
i
−
1
\frac{h}{2^{i-1}}
2i−1h,第i次落地,第i次反弹
h
2
i
\frac{h}{2^i}
2ih 第10次落地之前,共经历了10次下落,9次反弹,将下落和反弹的距离加和,设总距离为s:
s
=
h
+
h
2
+
h
2
+
h
4
+
h
4
+
.
.
.
+
h
2
9
+
h
2
9
=
h
+
2
(
h
2
+
h
4
+
.
.
.
+
h
2
9
)
=
h
+
h
+
h
2
+
h
4
+
.
.
.
+
h
2
8
\begin{aligned} s &= h + \frac{h}{2} +\frac{h}{2} + \frac{h}{4}+\frac{h}{4}+...+\frac{h}{2^{9}}+\frac{h}{2^{9}}\\&= h + 2(\frac{h}{2} + \frac{h}{4} + ... +\frac{h}{2^{9}}) \\ &= h + h + \frac{h}{2} + \frac{h}{4} + ... +\frac{h}{2^{8}} \end{aligned}
s=h+2h+2h+4h+4h+...+29h+29h=h+2(2h+4h+...+29h)=h+h+2h+4h+...+28h根据等比序列加和公式:
S
n
=
a
1
1
−
q
n
1
−
q
S_n = a_1\frac{1-q^n}{1-q}
Sn=a11−q1−qn 可以得到
s
=
h
(
1
+
1
+
1
2
+
1
4
+
.
.
.
+
1
2
8
)
=
h
(
1
+
1
−
(
1
2
)
9
1
−
1
2
)
=
h
(
3
−
1
2
8
)
\begin{aligned} s &= h(1 + 1 + \frac{1}{2} + \frac{1}{4} + ... +\frac{1}{2^{8}}) \\ &=h(1 + \frac{1-(\frac{1}{2})^9}{1-\frac{1}{2}})\\ &= h(3 - \frac{1}{2^8}) \end{aligned}
s=h(1+1+21+41+...+281)=h(1+1−211−(21)9)=h(3−281)根据规律可知,第10次反弹的距离为:
h
2
10
\frac{h}{2^{10}}
210h
【题解代码】
解法1:使用循环描述球的运行过程
#include
using namespace std;
int main()
{
double h;//弹跳高度
cin>>h;
double sum = h;//sum:总距离,初始值设为h,即第一次下落的距离为h
for(int i = 2; i
double h;
cin>>h;
cout |