java零基础入门-经典算法题解(二)

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

哈喽,各位小伙伴们好,我是喵手。

一、前言

       上一期我们是讲了三道算法题,分别如下:

  • 统计一段英语句子中带有多少个“o”的字符

  • 判断闰年平年并且输出某月的天数

  • 打印九九乘法表

       不知道小伙伴们,掌握的如何,有没有自己独立写出来,如果没有写出来的小伙伴,没关系,你可以再好好研究我写的,然后看懂思路。如果有小伙伴对以上三道感兴趣,也无妨自己可以试试。java零基础入门-经典算法题解(一)

       接下来,我要把上期遗留的 课后作业进行一个全面剖析, 包括代码实现及解题思路。希望能给 小伙伴们带来算法乐趣。 

       上期课后作业算法题如下:

  1. 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?

  2. 题目:判断101-200之间有多少个素数,并输出所有素数。

  3. 题目:打印出100-400之间所有的水仙花数 ,所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。

二、算法实现

1、求每个月兔子总数?

       首先,看到这题,我们应该要有个思维,那就是找规律,可以自己先尝试枚举几个月出来,看看能否成总数上找到有何规律。

       我现来,枚举看看,每个月兔子总对数分别如下。

  • 第1个月兔子总对数为:1
  • 第2个月兔子总对数为:1
  • 第3个月兔子总对数为:2
  • 第4个月兔子总对数为:3
  • 第5个月兔子总对数为:5
  • 第6个月兔子总对数为:8
  • 第7个月兔子总对数为:13
  • 第8个月兔子总对数为:21
  • 第9个月兔子总对数为:34
  • ...

       仔细一看这每个月的兔子对数,这不就是典型的斐波那契数列问题啊[1,1,2,3,5,8,13,21,34...],很明显就是符合斐波那契数列。针对该问题,满足函数f(x+2) = f(x+1)+f(x)。其中x表示当前月份,x+2表示当前月份的第二个月份,所以分析可得,直接一套递归带走。

代码实现:

1、先定义一个递归函数,要求就是实现:f(x) = f(x-1)+f(x-2)【其中x>=3】;

/**
 * 斐波那契函数
 */
public static int fbnq(int month) {
    int sum = 0;
    if (0 < month && month < 3) {
        sum = 1;
    }
    if (month >= 3) {
        sum = fbnq(month - 1) + fbnq(month - 2);
    }
    return sum;
}
复制代码

需要注意的是,由于第一个月和第二个月兔子对数都不变,所以需要单独提前告知sum的值,枚举month=1与month=2的值即可,往后就直接自我递归调用计算。

2、然后写个main主函数进行调用即可

public static void main(String[] args) {
        System.out.println("请输入您要计算的月份:");
    Scanner scanner = new Scanner(System.in);
    int month = scanner.nextInt();
    int sum = fbnq(month);
    System.out.println("第" + month + "月的兔子对数为:" + sum);
}
复制代码

3、控制台实际打印如下:

请输入您要计算的月份:
9
第9月的兔子对数为:34

请输入您要计算的月份:
2
第2月的兔子对数为:1

请输入您要计算的月份:
5
第5月的兔子对数为:5
复制代码

2、求101-200之间有多少素数?

       这题的话,与上一题相比,其实就简单些了,你只需要知道什么是素数就能解题了。

素数:素数即是质数,要求满足在大于1的自然数中,除了1和它本身以外不再有其他因数。

所以很简单吧,因为前几期有讲解过求质数的,对吧,所以直接直奔主题吧。

1、定义一个判断是否为质数的方法

/**
 * 判断是否是质数
 */
public static boolean isZS(int num) {

    //排除1不是质数
    if (num == 1) {
        return false;
    }
    for (int i = 2; i < num - 1; i++) {
        //进行求余;只要余数为0,说明i被整除,该i就是num的一个因子。
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}
复制代码

2、写一个循环结构,从101-200的范围。

/**
 * 101-200范围内
 */
public static String printZS() {
    //用于统计质数
    String zs = "";
    //循环101-200
    for (int i = 101; i <= 200; i++) {
        //true表示是质数
        if (isZS(i)) {
            zs += "," + i;
            continue;
        }
    }
    return zs;
}
复制代码

3、进行main函数调用

public static void main(String[] args) {

    String strZS = printZS();
    //去掉第一个逗号;
    String subZS = strZS.substring(1);
    System.out.println(subZS);
}
复制代码

3、求打印100-400之间的水仙花数?

       这一题与第二题差不多,都是求某种数,重点就是要知道水仙花数的符合规则,只要知道这个要求,算法实现就简单了。

       水仙花数:是指一个三位数,其各位数字立方和等于该数本身。例如:153就是一个水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。

       所以,最暴力的解决思路就是,分别取三个数字进行立方再相加,看看是否会等于原值本身。

1、先实现一个判断是否为水仙花数的方法。

/**
 * 判断是否是水仙花数
 */
public static boolean isSXHS(int num) {
    //取个位数
    int x = num % 100 % 10;
    //取十位数
    int y = num / 10 % 10;
    //取百位数
    int z = num / 100;
    //进行判断
    if (num == (lf(x) + lf(y) + lf(z))) {
        System.out.println(num + "=" + z + "的三次方+" + y + "的三次方+" + x + "的三次方"); 
       return true;
    }
    return false;
}

/**
 * 手动实现一个求立方的方法
 */
public static int lf(int num) {
    return num * num * num;
}
复制代码

2、控制循环范围,依次进行数字判断。

/**
 * 100-400范围内
 */
public static String printSXHS() {
    //用于统计水仙花数
    String sxhs = "";
    //循环100-400
    for (int i = 100; i <= 400; i++) {
        //true表示是水仙花数
        if (isSXHS(i)) {
            sxhs += "," + i;
            continue;
        }
    }
    return sxhs;
}
复制代码

3、进行main函数调用。

public static void main(String[] args) {

    String strSXHS = printSXHS();
    //去掉第一个逗号;
    String subSXHS = strSXHS.substring(1);
    System.out.println("水仙花数有:" + subSXHS);
}
复制代码

4、实际控制台输出打印。

153=1的三次方+5的三次方+3的三次方
370=3的三次方+7的三次方+0的三次方
371=3的三次方+7的三次方+1的三次方
水仙花数有:153,370,371
复制代码

... ...

       对于以上三题,难度可以说两颗星吧,不是很难,两道数字题,一道规律题。多练习,肯定都能掌握。

接下来,又到了我布置作业的时候了。请听题,大家好好练习哦。

三、课后作业

1、将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

2、利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

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

... ...

课后作业放在下期教学,大家先做,明天公布算法解析。

四、结尾

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

---------------------------------------------------------------------

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

---------------------------------------------------------------------

Guess you like

Origin juejin.im/post/7060303404844711967