飞道的博客

Java 实现 C 语言经典 100 例(16 - 20)

432人阅读  评论(0)

1. 实例 16

1.1 题目

输入两个正整数m和n,求其最大公约数和最小公倍数。

1.2 思路

  1. 最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;

  2. 求最大公约数用辗转相除法(欧几里德算法)

  3. 两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为 GCD

  4. g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b) = gcd(b,a mod b) (设 a > b a>b r = a % b , r 0 r = 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 + a a + a a a + a a a a + a a . . . a s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2 + 22 + 222 + 2222 + 22222 2+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 / k n = n / k ,然后重复执行这一步
  3. 若 n 不能被 k 整除,则 k = k + 1 k = 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 米


转载:https://blog.csdn.net/github_39655029/article/details/106903864
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场