Ugly number Java

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

丑陋数字是 Java 中另一种特殊的正数。如果一个数的素数因子只有 2、3 或 5,并且按照约定也包括 1,那么这个数就称为丑陋数字。

让我们看一些丑陋数字的例子。

  1. 27 不是丑陋数字,因为它的素数因子包含 7。
  2. 12 是丑陋数字,因为它的素数因子是 2 和 3。
  3. 28 也不是丑陋数字,因为它的素数因子也包含 7。
  4. 16 是丑陋数字,因为它的素数因子只包含 2。
Ugly number Java

Java 中,我们可以通过两种方法找到第 N 个丑陋数字。这些方法如下:

  1. 使用 for 循环的简单方法
  2. 使用动态规划

让我们逐一了解这两种方法,并实现它们各自的逻辑。

使用 for 循环的简单方法

在此方法中,我们使用循环遍历每个正数,直到丑陋数字计数不大于 n。当一个数字是丑陋数字时,我们增加计数器变量,并通过 2、3 和 5 的最大可整除幂来检查数字是否是丑陋数字。当数字变为 1 时,它就是一个丑陋数字。否则,它不是丑陋数字。

让我们实现代码以在 Java 中获取第 N 个丑陋数字。

UglyNumberExample1.java

输出

Ugly number Java

同样,我们也可以实现代码来检查给定的数字是否是丑陋数字。

UglyNumberExample2.java

输出

Ugly number Java

使用动态规划

还有另一种获取第 N 个丑陋数字的方法,它需要 O(n) 的额外空间。开头一些丑陋数字的序列是 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ……..

我们可以将上述序列分成三个子序列,使得每个组中的丑陋序列如下:

  1. 1×2, 2×2, 3×2, 4×2, 5×2, …
  2. 1×3, 2×3, 3×3, 4×3, 5×3, …
  3. 1×5, 2×5, 3×5, 4×5, 5×5, …

为了从序列中获取每个丑陋数字,我们使用类似归并排序的合并方法。

以下是使用动态规划获取第 N 个丑陋数字的步骤:

  1. 首先,我们为丑陋数字声明一个数组。
  2. 1 是第一个丑陋数字,所以我们在程序中将其初始化为第一个丑陋数字。
  3. 接下来,我们将 i2、i3、i5 初始化为数组索引变量,用于指向丑陋数组的第一个元素。
    i2 = i3 = i5 =0;
  4. 初始化为下一个丑陋数字的选择,如下:
    mulitple2 = ugly[i2]*2;
    mulitple3 = ugly[i3]*3
    mulitple5 = ugly[i5]*5;
  5. 我们使用循环语句来填充给定范围内的所有丑陋数字。
  1. 最后,我们返回 nextUglyNumber。

让我们使用上述步骤,在 Java 中实现其实际代码。

UglyNumberExample3.java

输出

Ugly number Java