那些年,我们一起做过的 Java 课后练习题(11 - 15)

实例 11

题目

有 1、2、3、4 四个数字,能组成多少个互不相同且无重复数字的三位数?这些三位数都是多少?

分析

直接三重循环,然后加一个判断语句,让三位数的各位上的数都不相同即可!

实现

/**
 * Created with IntelliJ IDEA.
 *
 * @author : cunyu
 * @version : 1.0
 * @email : 747731461@qq.com
 * @公众号 : 村雨遥
 * @website : https://cunyu1943.github.io
 * @date : 2021/6/2 16:46
 * @project : Java 编程实例
 * @package : PACKAGE_NAME
 * @className : Example11
 * @description :
 */

public class Example11 {
    public static void main(String[] args) {
        int count = 0;
        System.out.println("组成的三位数是:");
        for (int i = 1; i < 5; i++) {
            for (int j = 1; j < 5; j++) {
                if (i != j) {
                    for (int k = 1; k < 5; k++) {
                        if (i != k && j != k) {
                            count++;
                            System.out.print((i * 100 + j * 10 + k) + "\t");
                            // 每打印 5 个就换行
                            if (count % 5 == 0) {
                                System.out.println();
                            }
                        }
                    }
                }
            }
        }

        System.out.println("\n共有 " + count + " 个不重复的三位数");
    }
}

结果

实例 12

题目

企业发放的奖金根据利润提成。利润低于或等于 10 万元时,奖金可提 10%;利润高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10% 提成,高于10万元的部分,可提成 7.5%;20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;40 万到60 万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,高于 100 万元时,超过 100 万元的部分按 1% 提成,从键盘输入当月利润,求应发放奖金总数?

分析

分段计算利润即可;

实现

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : cunyu
 * @version : 1.0
 * @email : 747731461@qq.com
 * @公众号 : 村雨遥
 * @website : https://cunyu1943.github.io
 * @date : 2021/6/2 17:14
 * @project : Java 编程实例
 * @package : PACKAGE_NAME
 * @className : Example12
 * @description :
 */

public class Example12 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入当月利润(万)");
        int profit = scanner.nextInt();
        double bonus = 0;
        if (profit <= 10) {
            bonus = profit * 0.1;
        } else if (10 < profit && profit <= 20) {
            bonus = 10 * 0.1 + (profit - 10) * 0.075;
        } else if (20 < profit && profit <= 40) {
            bonus = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05;
        } else if (40 < profit && profit <= 60) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;
        } else if (60 < profit && profit <= 100) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;
        } else if (profit > 100) {
            bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01;
        }

        System.out.println("利润为 " + profit + " 时的奖金为:" + bonus + " 万");
    }
}

结果

实例 13

题目

一个整数,加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?

分析

假设这个数是 num,那么就有:

  • num + 100 = n * n, num + 100 + 168 = m * m
  • m * m - n * n = (m + n)(m - n) = 168
  • m+n=im + n = im+n=im−n=jm - n = jmn=ji∗j=168i * j =168ij=168iiijjj 至少一个是偶数
  • 那么 m=(i+j)/2m = (i + j) / 2m=(i+j)/2n=(i−j)/2n = (i - j) / 2n=(ij)/2iiijjj 要么都是偶数,要么都是奇数
  • 从上面两部推导可知,iiijjj 均是不小于 2 的偶数
  • 由于 i∗j=168i * j = 168ij=168,$ j>=2$,则 1<i<=168/21 < i <= 168 / 21<i<=168/2
  • 接下来将 iii 的所有数字循环计算即可

实现

/**
 * Created with IntelliJ IDEA.
 *
 * @author : cunyu
 * @version : 1.0
 * @email : 747731461@qq.com
 * @公众号 : 村雨遥
 * @website : https://cunyu1943.github.io
 * @date : 2021/6/3 9:01
 * @project : Java 编程实例
 * @package : PACKAGE_NAME
 * @className : Example13
 * @description :
 */

public class Example13 {
    public static void main(String[] args) {
        int m = 0;
        int n = 0;
        int num = 0;
        System.out.println("该数可能是:");
        for (int i = 1; i <= (168 / 2); i++) {
            if (168 % i == 0) {
                int j = 168 / i;
                if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0) {
                    m = (i + j) / 2;
                    n = (i - j) / 2;
                    num = n * n - 100;
                    System.out.print(num + "\t");
                }
            }
        }
    }
}

结果

实例 14

题目

输入某年某月某日,判断这一天是这一年的第几天?

分析

分别输入年月日,然后优先判断是否为闰年,然后根据是否闰年给出 2 月的天数,最后就是 switch 匹配月份,把天数相加即可。

实现

import java.util.GregorianCalendar;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : cunyu
 * @version : 1.0
 * @email : 747731461@qq.com
 * @公众号 : 村雨遥
 * @website : https://cunyu1943.github.io
 * @date : 2021/6/3 9:39
 * @project : Java 编程实例
 * @package : PACKAGE_NAME
 * @className : Example14
 * @description :
 */

public class Example14 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;
        System.out.println("输入年:");
        year = scanner.nextInt();
        System.out.println("输入月:");
        month = scanner.nextInt();
        System.out.println("输入日:");
        day = scanner.nextInt();

        // 判断是否是闰年
        // GregorianCalendar:判断年份是否是闰年的方法
        GregorianCalendar gre = new GregorianCalendar();
        // 返回true:是闰年,false:不是闰年
        boolean isLeapYear = gre.isLeapYear(year);

//        2 月份的天数
        int feb = isLeapYear ? 29 : 28;

        int dayOfYear = 0;

        switch (month) {

            case 1:
                dayOfYear = day;
                break;
            case 2:
                dayOfYear = 31 + day;
                break;
            case 3:
                dayOfYear = 31 + feb + day;
                break;
            case 4:
                dayOfYear = 31 + feb + 31 + day;
                break;
            case 5:
                dayOfYear = 31 + feb + 31 + 30 + day;
                break;
            case 6:
                dayOfYear = 31 + feb + 31 + 30 + 31 + day;
                break;
            case 7:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + day;
                break;
            case 8:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + 31 + day;
                break;
            case 9:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + day;
                break;
            case 10:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + day;
                break;
            case 11:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + day;
                break;
            case 12:
                dayOfYear = 31 + feb + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + day;
                break;

            default:
                System.out.println("月份输入错误");
                break;
        }
        System.out.println("这一天是这一年的第 " + dayOfYear + " 天!");

    }
}

结果

实例 15

题目

输入三个整数 num1、num2、num3,请把这三个数从小到大输出。

分析

分别输入三个数,然后两两之间比较并交换,小的在前,大的在后,最后从小到大输出三个数即可;

实现

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 *
 * @author : cunyu
 * @version : 1.0
 * @email : 747731461@qq.com
 * @公众号 : 村雨遥
 * @website : https://cunyu1943.github.io
 * @date : 2021/6/3 10:08
 * @project : Java 编程实例
 * @package : PACKAGE_NAME
 * @className : Example15
 * @description :
 */

public class Example15 {
    public static void main(String[] args) {
        int num1 = 0;
        int num2 = 0;
        int num3 = 0;

        Scanner scanner = new Scanner(System.in);
        System.out.println("输入第 1 个数");
        num1 = scanner.nextInt();
        System.out.println("输入第 2 个数");
        num2 = scanner.nextInt();
        System.out.println("输入第 3 个数");
        num3 = scanner.nextInt();

//        交换 num1、num2
        if (num1 > num2) {
            int tmp = num1;
            num1 = num2;
            num2 = tmp;
        }

//        交换 num1、num3
        if (num1 > num3) {
            int tmp = num1;
            num1 = num3;
            num3 = tmp;
        }

//        交换 num2、num3
        if (num2 > num3) {
            int tmp = num2;
            num2 = num3;
            num3 = tmp;
        }

        System.out.format("三个数从小到大的顺序:%d < %d < %d", num1, num2, num3);
    }
}

结果

先展示下效果 https://pan.quark.cn/s/a4b39357ea24 遗传算法 - 简书 遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。 遗传算法(英语:genetic algorithm (GA) )是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择、杂交等。 搜索算法的共同特征为: 首先组成一组候选解 依据某些适应性条件测算这些候选解的适应度 根据适应度保留某些候选解,放弃其他候选解 对保留的候选解进行某些操作,生成新的候选解 遗传算法流程 遗传算法的一般步骤 my_fitness函数 评估每条染色体所对应个体的适应度 升序排列适应度评估值,选出 前 parent_number 个 个体作为 待选 parent 种群(适应度函数的值越小越好) 从 待选 parent 种群 中随机选择 2 个个体作为父方和母方。 抽取父母双方的染色体,进行交叉,产生 2 个子代。 (交叉概率) 对子代(parent + 生成的 child)的染色体进行变异。 (变异概率) 重复3,4,5步骤,直到新种群(parentnumber + childnumber)的产生。 循环以上步骤直至找到满意的解。 名词解释 交叉概率:两个个体进行交配的概率。 例如,交配概率为0.8,则80%的“夫妻”会生育后代。 变异概率:所有的基因中发生变异的占总体的比例。 GA函数 适应度函数 适应度函数由解决的问题决定。 举一个平方和的例子。 简单的平方和问题 求函数的最小值,其中每个变量的取值区间都是 [-1, ...
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村雨遥

众筹一毛买键盘!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值