Practical Number in Java

2025年5月8日 | 阅读6分钟

在本节中,我们将学习什么是实际数,并创建 Java 程序 来检查给定的数字是否为实际数实际数程序经常在 Java 编码面试和学术中被问到。

实际数

如果一个数 X 的所有小于 X 的数 Y (Y < X) 都可以写成 X 的一个唯一真约数之和,则称 X 为Java 中的实际数。请注意,一个数的真约数不包括该数本身。

查找实际数的步骤

步骤 1:将一个数字赋给变量。

步骤 2:找出给定数字的真约数。

步骤 3:将这些约数存储在列表中。

步骤 4:逐个取出小于给定数字的所有数字(1 到给定数字 - 1),并尝试从列表(在步骤 3 中找到)中找到一个子集,其总和等于取出的数字。

步骤 5:检查从 1 到给定数字 - 1 的每个数字是否都能找到子集。如果找到子集,则给定数字是实际数;否则不是。

实际数示例

给定 X = 10

则 X 的真约数为:1, 2, 5

小于 10 的所有数字为 Y = {1, 2, 3, 4, 5, 6, 7, 8, 9}

检查 Y 中的每个数字是否存在。

1 = 1 (1 是 X 的真约数)

2 = 2 (2 也是 X 的真约数)

3 = 1 + 2 (1 & 2 都是 X 的真约数。而且它们是唯一的)

4 = 2 + 2 (2 是 X 的真约数。但是,2 出现了两次,不唯一)

因此,我们找到了至少一个不满足所述条件的数字。所以,数字10不是实际数。

给定 X = 12

则 X 的真约数为:1, 2, 3, 4, 6

小于 12 的所有数字为 Y = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}

检查 Y 中的每个数字是否存在。

1 = 1 (1 是 X 的真约数)

2 = 2 (2 也是 X 的真约数)

3 = 1 + 2 (1 & 2 都是 X 的真约数。而且它们是唯一的)

4 = 1 + 3 (1 & 3 都是 X 的真约数。而且它们是唯一的)

5 = 2 + 3 (2 & 3 都是 X 的真约数。而且它们是唯一的)

6 = 2 + 4 (2 & 4 都是 X 的真约数。而且它们是唯一的)

7 = 3 + 4 (3 & 4 都是 X 的真约数。而且它们是唯一的)

8 = 2 + 6 (2 & 6 都是 X 的真约数。而且它们是唯一的)

9 = 3 + 6 (3 & 6 都是 X 的真约数。而且它们是唯一的)

10 = 1 + 3 + 6 (1, 3, & 6 都是 X 的真约数。而且它们是唯一的)

11 = 2 + 3 + 6 (2, 3 & 6 都是 X 的真约数。而且它们是唯一的)

因此,我们发现 Y 中的所有数字都满足给定条件。所以,数字12是一个实际数。

Practical Number in Java

实际数 Java 程序

观察以下检查 1 到 20 之间实际数的 Java 程序。

文件名:PracticalNumberExample.java

输出

The number 1 is the practical number.
The number 2 is the practical number.
The number 3 is not the practical number.
The number 4 is the practical number.
The number 5 is not the practical number.
The number 6 is the practical number.
The number 7 is not the practical number.
The number 8 is the practical number.
The number 9 is not the practical number.
The number 10 is not the practical number.
The number 11 is not the practical number.
The number 12 is the practical number.
The number 13 is not the practical number.
The number 14 is not the practical number.
The number 15 is not the practical number.
The number 16 is the practical number.
The number 17 is not the practical number.
The number 18 is the practical number.
The number 19 is not the practical number.
The number 20 is the practical number.

解释:对于 1 到 20 之间的每个数字,通过 for 循环调用 isPracticalNo() 方法。对于每个数字,都会创建一个 vector 因子来存储其约数。现在,对于从 1 到给定数字 (num) 的每个数字,我们尝试使用动态规划找到子集。如果对于从 1 到给定数字 (num) 的每个数字都能找到子集,则给定数字 (num) 是完美数;否则不是。

注意:可以使用递归来查找子集,而不是动态规划。然而,与动态规划方法相比,递归方法将需要更多时间来生成子集。