Java 實現 C 語言經典 100 例(21 - 25)

1. 實例 21

1.1 題目

猴子喫桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個
第二天早上又將剩下的桃子喫掉一半,又多吃了一個。以後每天早上都吃了前一天剩下
的一半零一個。到第10天早上想再喫時,見只剩下一個桃子了。求第一天共摘了多少。

1.2 思路

  1. 設第一天桃子數爲 x1x1,則第二天桃子數爲 x2=x1/21x2 = x1 / 2 - 1,第三天桃子數爲 x3=x2/21x3 = x2/2 - 1
  2. 反過來推,則 x1=2(x2+1),x2=2(x3+1)...x1 = 2(x2+1),x2=2(x3+1)...
  3. 以此類推,從第 10 天類推到第一天是一個循環

1.3 代碼

/**
 * @ClassName : TwentyOne
 * @Author : cunyu
 * @Date : 2020/6/23 7:59
 * @Version : 1.0
 * @Description : 實例 21
 **/

public class TwentyOne {
    public static void main(String[] args) throws Exception {
        // num:第10天的桃子數
        int num = 1;
        // 總的桃子數
        int sum = 0;

        // 逆向推,前一天的桃子數 = 2 * (後一天桃子數 + 1),前邊有 9 天,所以循環 9 次
        for (int i = 0; i < 9; i++) {
            sum = 2 * (num + 1);
            num = sum;
        }

        System.out.println("桃子總數:" + sum);
    }
}

1.4 結果

桃子總數:1534

2. 實例 22

2.1 題目

兩個乒乓球隊進行比賽,各出三人。甲隊爲a,b,c三人,乙隊爲x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。

2.2 思路

見代碼註釋即可

2.3 代碼

/**
 * @ClassName : TwentyTwo
 * @Author : cunyu
 * @Date : 2020/6/23 8:27
 * @Version : 1.0
 * @Description : 實例 22
 **/

public class TwentyTwo {
    public static void main(String[] args) throws Exception {
        char a, b, c;
        System.out.println("對陣順序表:");

        // 事先 a,b,c 均可能對陣上 x,y,z
        for (a = 'x'; a <= 'z'; a++) {
            for (b = 'x'; b <= 'z'; b++) {
                for (c = 'x'; c <= 'z'; c++) {
                    // a 不對陣 x,c 不對陣 x,z
                    if (a != 'x' && c != 'x' && c != 'z') {
                        // a,b,c 對陣選手不同
                        if (a != b && a != c && b != c) {
                            System.out.format("a --> %c\t b --> %c\tc --> %c", a, b, c);
                        }
                    }
                }
            }
        }
    }
}

2.4 結果

對陣順序表:
a --> z	 b --> x	c --> y

3. 實例 23

3.1 題目

打印出如下圖案(菱形)。

*
***
*****
*******
*****
***
*

3.2 思路

圖形可拆分爲兩部分來看待,前四行一個規律,後三行一個規律,利用雙重for循環,第一層控制行,第二層控制列

3.3 代碼

/**
 * @ClassName : TwentyThree
 * @Author : cunyu
 * @Date : 2020/6/23 8:41
 * @Version : 1.0
 * @Description : 實例 23
 **/

public class TwentyThree {
    public static void main(String[] args) throws Exception {

        // 上半部分
        for (int i = 0; i < 4; i++) {
            for (int j = 4; j > i + 1; j--) {
                // 輸出左上角位置的空白
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * i + 1; j++) {
                // 輸出菱形上半部邊緣
                System.out.print("*");
            }
            // 換行
            System.out.println();
        }

        // 下半部分
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < i + 1; j++) {
                // 輸出菱形左下角空白
                System.out.print(" ");
            }
            for (int j = 0; j < 2 * (3 - i) - 1; j++) {
                // 輸出菱形下半部邊緣
                System.out.print("*");
            }
            // 換行
            System.out.println();
        }
    }


}

3.4 結果

   *
  ***
 *****
*******
 *****
  ***
   *

4. 實例 24

4.1 題目

有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。

4.2 思路

從第 2 個數開始,後一個數的分母是前一個的分子,而分子則是前一個數的分子與分母之和

4.3 代碼

/**
 * @ClassName : TwentyFour
 * @Author : cunyu
 * @Date : 2020/6/23 8:59
 * @Version : 1.0
 * @Description : 實例 24
 **/

public class TwentyFour {
    public static void main(String[] args) throws Exception {
        double sum = 0.0;
        float numerator = 2.0f;
        float denominator = 1.0f;

        // 從第 2 個數開始
        for (int i = 1; i <= 20; i++) {
            sum = sum + numerator / denominator;
            float tmp = denominator;
            // 後一個數的分母等於前一個數的分子
            // 而後一個數的分子等於前一個數的分子分母之和
            denominator = numerator;
            numerator += tmp;
        }

        System.out.println("最終結果:" + sum);
    }
}

4.4 結果

最終結果:32.660260796546936

5. 實例 25

5.1 題目

1+2!+3!+...+20!1+2!+3!+...+20! 的和。

5.2 思路

類似於累加,詳細情況見代碼。

5.3 代碼

/**
 * @ClassName : TwentyFive
 * @Author : cunyu
 * @Date : 2020/6/23 9:12
 * @Version : 1.0
 * @Description : 實例 25
 **/

public class TwentyFive {
    public static void main(String[] args) throws Exception {
        // 最終結果和第一個值
        long sum = 0;
        long num = 1;

        for (int i = 1; i <= 20; i++) {
            // i = 1,num = 1
            // i = 2,num = 1 * 2
            // i = 3,num = 1 * 2 * 3
            num = i * num;
            // 求和
            sum += num;
        }

        System.out.println("最終結果:" + sum);
    }
}

5.4 結果

最終結果:2561327494111820313

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章