### JAVA经典算法解析
#### 程序1:斐波那契数列
**题目**:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
**代码实现**:
```java
public class Exp2 {
public static void main(String[] args) {
int i = 0;
for (i = 1; i <= 20; i++) {
System.out.println(f(i));
}
}
public static int f(int x) {
if (x == 1 || x == 2) {
return 1;
} else {
return f(x - 1) + f(x - 2);
}
}
}
```
**知识点说明**:
- **斐波那契数列**:是一个著名的数列,每一项都是前两项之和,通常定义为F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2)。
- **递归方法**:上面的代码使用了递归的方式来计算斐波那契数列的第n项。递归是一种函数调用自身的编程技术,在解决这类序列问题时非常有效。
- **性能考虑**:虽然递归方法简洁明了,但对于较大的数值计算效率较低。可以采用迭代或其他优化方法提高性能。
#### 素数判断
**题目**:判断101-200之间有多少个素数,并输出所有素数。
**代码实现**:
```java
public class Exp2 {
public static void main(String[] args) {
int i = 0;
Math myMath = new Math();
for (i = 101; i <= 200; i++) {
if (myMath.isPrime(i)) {
System.out.println(i);
}
}
}
}
class Math {
public boolean isPrime(int x) {
if (x < 2) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
}
```
**知识点说明**:
- **素数定义**:只能被1和自身整除的大于1的自然数称为素数(或质数)。
- **判断素数方法**:上述代码采用了较为高效的判断方式,即只检查到√x即可。这是因为如果x不是素数,则它必有一个小于等于√x的因子。
- **性能优化**:使用`Math.sqrt(x)`可以减少循环次数,提高效率。
#### 水仙花数
**题目**:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。
**代码实现**:
```java
public class Exp2 {
public static void main(String[] args) {
int i = 0;
Math myMath = new Math();
for (i = 100; i <= 999; i++) {
if (myMath.isNarcissistic(i)) {
System.out.println(i);
}
}
}
}
class Math {
public boolean isNarcissistic(int x) {
int hundred = x / 100;
int ten = (x % 100) / 10;
int unit = x % 10;
if (x == Math.pow(hundred, 3) + Math.pow(ten, 3) + Math.pow(unit, 3)) {
return true;
} else {
return false;
}
}
}
```
**知识点说明**:
- **水仙花数定义**:水仙花数是一个三位数,它的每个位上的数字的立方和等于它本身。
- **分解数字**:通过除法和取模运算来获取数字的各个位数。
- **性能考虑**:由于水仙花数仅限于三位数,因此这种遍历方法足够高效。
#### 正整数分解质因数
**题目**:将一个正整数分解质因数。例如:输入90, 打印出90=2*3*3*5。
**代码实现**:
```java
public class Exp2 {
public void decompose(int n) {
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
System.out.print(i + "*");
n /= i;
}
}
System.out.println(n);
}
public static void main(String[] args) {
Exp2 exp2 = new Exp2();
exp2.decompose(90);
}
}
```
**知识点说明**:
- **质因数分解**:将一个正整数表示为其质因数的乘积形式。
- **分解过程**:从最小的质数2开始尝试,每次找到一个质因数后就将其从原数中去除,直到原数变为1。
- **性能优化**:上述实现中使用了一个while循环来处理每个质因数可能重复出现的情况,这种方法比递归更高效且易于理解。
以上四个经典问题不仅涵盖了基本的数学概念,还涉及到了数据结构和算法的基本思想,对于初学者来说是非常好的实践案例。