******************************************************
在第 10 次落地时总路程 为: 299.609375该次反弹的路程为: 0.09765625
******************************************************
一个球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时,共经过多少米?第10次反弹多高
******************************************************
An Sn
1下 100 100 100
1上 100/2 50 150
2下 100/2 50 200
2上 (100/2)/2 25 225
3下 (100/2)/2 25 250
3上 ((100/2)/2)/2 12.5 262.5
4下 ((100/2)/2)/2 12.5 275
4上 (((100/2)/2)/2)/2 6.25 283.25
....
10下 (((100/2)/2)....)/2 除以9次2
10上 (((100/2)/2)....)/2 除以10次2
n次下 100/(2^(n-1))
n次上 100/(2^n)
******************************************************
将下抽取出来
An Sn
1下 100 100 100
2下 100/2 50 150
3下 (100/2)/2 25 175
4下 ((100/2)/2)/2 12.5 187.5
..
10下 (((100/2)/2)....)/2 除以9次2
发现其为一个等比数列
其中首项:a1 = 100 公比:q = 1/2 = 0.5
通项公式:An = a1 * q ^ (n - 1)
求和公式:
当q != 1时, Sn = a1 * (1 - q^n) / (1 - q)
当q = 1时,Sn = n * a1
******************************************************
将上抽取出来:
1上 100/2
2上 (100/2)/2
3上 ((100/2)/2)/2
4上 (((100/2)/2)/2)/2
...
发现其为一个等比数列
其中首项:b1 = a1 * q 公比:q = 1/2 = 0.5
通项公式:Bn = b1 * q ^ (n - 1)
******************************************************
经观察,Sn下 = S(n-1)上,即Sn = B(n-1)
所以,它在第10次落地时,共经过多少米,应为 S10下+S9上
所以,Sn总= 2 Sn下 - 100,即Sn_sum = 2 * Sn - a1
因此,本题中,求从100米落下,每次落地后反跳回原高度的一半,求它在第10次落地时,共经过多少米?
把 a1 = 100, q = 0.5带入以下公式即可
Sn = a1 * (1 - q^n) / (1 - q)
Sn_sum = 2 * Sn - a1;
因此,本题中,求第10次反弹的高度
把 a1 = 100, q = 0.5带入以下公式即可
Bn = b1 * q ^ (n - 1)
******************************************************- package Heima001_DumpAndDown100;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- public class Test001_DumpAndDown100 {
- public static void main(String[] args) throws IOException {
- System.out.println("一个球从100米高度自由落下,每次落地后反跳回原高度的一半," + "再落下,求它在第10次落地时,共经过多少米?第10次反弹多高");
- System.out.println("请输入该球在第几次落地,程序将返回共经过多少米,以及返回该次反弹了多少米");
- System.out.println("即输入一个数字回车,本次结束,输入end回车,则程序结束");
- // 字符输入流
- BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
- // 字符输出流
- BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
- String line = null;
- String end = "end";
- // 等比数列公式参数定义:
- // 定义项数n
- int n = 0;
- // 定义公比q
- double q = 0.5;
- // 下落时的等比数列,定义首项a1
- double a1 = 100;
- //下落时的等比数列, 通项公式:An = A1×q^(n-1)
- double An = 0;
- // 下落时的等比数列,求和公式Sn,q≠1时:Sn=a1(1-q^n)/(1-q);q=1时: Sn=n×a1(q=1)
- double Sn_down = 0;
- // 上升时的等比数列,定义首项b1: b1 = a1 * q;
- double b1 = 0;
- //上升时的等比数列,通项公式:Bn = b1 * q ^ (n - 1)
- double Bn = 0;
- //上升和下降的总路程,Sn_sum = 2 Sn_down - a1;
- double Sn_sum = 0;
-
- // 输入任意整数
- String regex = "\\d+";
- while ((line = bufr.readLine()) != null) {
- if (line.equals(end)) {
- break;
- } else if (!line.matches(regex)) {
- System.out.println("输入格式错误,请重新输入,如:23 或 end,回车");
- continue;
- } else {
- // n为输入的次数
- n = Integer.parseInt(line);
- // Sn下,Sn=a1(1-q^n)/(1-q)
- Sn_down = a1 * (1 - Math.pow(q, n)) / (1 - q);
- // Sn总= 2 Sn下 - 100
- Sn_sum = 2 * Sn_down - a1;
- //第1次上,b1 = a1 * q;
- b1 = a1 * q;
- // 第n次上:Bn = b1 * q ^ (n - 1)
- Bn = b1 * Math.pow(q, n - 1);
- System.out.println("你输入的n为:");
- bufw.write(line);
- bufw.newLine();
- bufw.flush();
- System.out.println("在第 " + n + " 次落地时" + "总路程为: " + Sn_sum + " 该次反弹的路程为: " + Bn);
- System.out.println("可继续输入,结束输入end");
- }
- }
- bufw.close();
- bufr.close();
- }
- }
复制代码 |