「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」
哈喽,各位小伙伴们好,我是喵手。
一、前言
上一期我们是讲了三道算法题,分别如下:
-
统计一段英语句子中带有多少个“o”的字符
-
判断闰年平年并且输出某月的天数
-
打印九九乘法表
不知道小伙伴们,掌握的如何,有没有自己独立写出来,如果没有写出来的小伙伴,没关系,你可以再好好研究我写的,然后看懂思路。如果有小伙伴对以上三道感兴趣,也无妨自己可以试试。java零基础入门-经典算法题解(一)
接下来,我要把上期遗留的 课后作业进行一个全面剖析, 包括代码实现及解题思路。希望能给 小伙伴们带来算法乐趣。
上期课后作业算法题如下:
-
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总对数为多少?
-
题目:判断101-200之间有多少个素数,并输出所有素数。
-
题目:打印出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 !!!
---------------------------------------------------------------------
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
---------------------------------------------------------------------