Java 實現 C 語言經典 100 例(16 - 20)

1. 實例 16

1.1 題目

輸入兩個正整數m和n,求其最大公約數和最小公倍數。

1.2 思路

  1. 最小公倍數=輸入的兩個數之積除於它們的最大公約數,關鍵是求出最大公約數;

  2. 求最大公約數用輾轉相除法(歐幾里德算法)

  3. 兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。最大公約數(Greatest Common Divisor)縮寫爲 GCD

  4. gcd(a,b)=gcd(b,amodb)gcd(a,b) = gcd(b,a mod b) (設 a>ba>br=a%b,r0r = a \% b ,r \ne 0)

1.3 代碼

import java.util.Scanner;

/**
 * @ClassName : Sixteen
 * @Author : cunyu
 * @Date : 2020/6/22 14:03
 * @Version : 1.0
 * @Description : 實例 16
 **/

public class Sixteen {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);

        System.out.println("輸入兩個數,每輸入一個回車一次");
        int num1 = input.nextInt();
        int num2 = input.nextInt();

        // 找出兩數中較大的數和較小的數
        int max = Math.max(num1, num2);
        int min = Math.min(num1, num2);

        // 兩數餘,乘積
        int remainder = max % min;
        int product = max * min;

        // 歐幾里得算法,輾轉相除
        while (remainder != 0) {
            max = min;
            min = remainder;
            remainder = max % min;
        }

        // 最小公倍數 = 兩數乘積 / 最大公約數
        System.out.println("最大公約數:" + min);
        System.out.println("最小公倍數:" + product / min);

    }
}

1.4 結果

輸入兩個數,每輸入一個回車一次
12 26
最小公倍數:156
最大公約數:2

2. 實例 17

2.1 題目

輸入一行字符,分別統計出其中英文字母、空格、數字和其它字符的個數。

2.2 思路

利用循環語句,遍歷字符串,對不同類別的字符計數

2.3 代碼

import java.util.Scanner;

/**
 * @ClassName : Seventeen
 * @Author : cunyu
 * @Date : 2020/6/22 14:39
 * @Version : 1.0
 * @Description : 實例 17
 **/

public class Seventeen {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);

        System.out.println("輸入字符串,回車結束輸入");
        String str = input.nextLine();

        // 用於計數不同類別字符
        int countChar = 0;
        int countSpace = 0;
        int countNum = 0;
        int countOther = 0;

        // 遍歷字符串,對字符串中的字符進行歸類計數
        for (int i = 0; i < str.length(); i++) {
            char cha = str.charAt(i);
            if ((cha >= 'a' && cha <= 'z') || (cha >= 'A' && cha <= 'Z')) {
                countChar++;
            } else if (cha >= '0' && cha <= '9') {
                countNum++;
            } else if (cha == ' ') {
                countSpace++;
            } else {
                countOther++;
            }
        }

        System.out.println("字母數:" + countChar);
        System.out.println("數字數:" + countNum);
        System.out.println("空格數:" + countSpace);
        System.out.println("其他:" + countOther);
    }
}

2.4 結果

輸入字符串,回車結束輸入
43255trewtertw4 tew 43 tew &#$
字母數:15
數字數:8
空格數:4
其他:3

3. 實例 18

3.1 題目

s=a+aa+aaa+aaaa+aa...as=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一個數字。例如 2+22+222+2222+222222+22+222+2222+22222 (此時共有 5 個數相加),幾個數相加有鍵盤控制。

3.2 思路

求和很簡單,關鍵在於要算出其中每項的具體值

3.3 代碼

import java.util.Scanner;

/**
 * @ClassName : Eighteen
 * @Author : cunyu
 * @Date : 2020/6/22 14:52
 * @Version : 1.0
 * @Description : 實例 18
 **/

public class Eighteen {
    public static void main(String[] args) throws Exception {
        Scanner input = new Scanner(System.in);

        System.out.println("輸入 a,n,每輸入一個值換行");
        int a = input.nextInt();
        int n = input.nextInt();

        // 和
        long sum = 0;
        // 第一次循環 a 的初始值
        int tmp = a;

        for (int i = 0; i < n; i++) {
            sum += tmp;
            a = a * 10;
            // 下次循環 a 的值 = 當次循環 a * 10 的值+ 當次循環 a 的值
            tmp += a;
        }

        System.out.println("a + aa + aaa + ... 的和:" + sum);
    }
}

3.4 結果

輸入 a,n,每輸入一個值換行
2
5
a + aa + aaa + ... 的和:24690

4. 實例 19

4.1 題目

一個數如果恰好等於它的因子之和,這個數就稱爲"完數"。例如 6=1+2+3.編程找出 1000 以內的所有完數。

4.2 思路

對於要分解的正整數 n,先找出一個最小的質數 k,

  1. 若該質數恰好等於 n,,則說明分解過程結束,打印輸出就可以了
  2. 若 n 能被 k 整除,則打印 k 的值,同時 n=n/kn = n / k,然後重複執行這一步
  3. 若 n 不能被 k 整除,則 k=k+1k = k + 1,重複執行 (1)

4.3 代碼

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName : Nineteen
 * @Author : cunyu
 * @Date : 2020/6/22 15:12
 * @Version : 1.0
 * @Description : 實例 19
 **/

public class Nineteen {
    public static void main(String[] args) throws Exception {
        final int SIZE = 1000;

        // 用於存儲 1000 以內的完數
        List<Integer> numList = new ArrayList<>();

        // 用於存儲每個數的因子
        int[] factorArr = new int[256];
        // 1 是每個數的因子
        factorArr[0] = 1;

        for (int i = 2; i < SIZE; i++) {
            int sum = factorArr[0];
            int k = 0;

            // 求除 1 外的因子,可以參考實例 14 中分解質因數
            for (int j = 2; j <= (i / 2); j++) {
                if (i % j == 0) {
                    sum += j;
                    factorArr[++k] = j;
                }
            }

            // 判斷該數是否爲完數
            if (sum == i) {
                numList.add(i);
            }
        }
        
        System.out.println("完數:");
        for (int i = 0; i < numList.size(); i++) {
            System.out.println(numList.get(i));
        }

    }
}

4.4 結果

完數:
6
28
496

5. 實例 20

5.1 題目

一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?

5.2 思路

直接看代碼註釋即可

5.3 代碼

/**
 * @ClassName : Twenty
 * @Author : cunyu
 * @Date : 2020/6/22 15:41
 * @Version : 1.0
 * @Description : 實例 20
 **/

public class Twenty {
    public static void main(String[] args) throws Exception {
        // 初始高度 & 經過路程
        float height = 100.0f;
        float sum = 100.0f;

        // 第一次反彈高度
        height = height / 2;

        for (int i = 1; i < 10; i++) {
            // 總的經過路程 = 初始經過路程 + 2 * 每次反彈的高度
            sum = sum + 2 * height;
            // 每次反彈前一次高度的一半
            height /= 2;
        }

        System.out.println("總的經過:" + sum + " 米");
        System.out.println("第 10 次反彈 " + height + " 米");
    }
}

5.4 結果

總的經過:299.60938 米
第 10 次反彈 0.09765625 米

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