Write a program to check whether a given number is an ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 6, 8
are ugly while 14
is not ugly since it includes another prime factor 7
.
Note that 1
is typically treated as an ugly number.
public boolean isUgly(int num) {
if (num < 1) return false;
while (num%2 == 0) num /= 2;
while (num%3 == 0) num /= 3;
while (num%5 == 0) num /= 5;
return num == 1;
}
Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number.
另外一个方法就是去生成这个序列,而不是排除。因为都是乘以2, 3, 5得来的,所以我们就可以维护三个指针,分别指向要乘以的下一个数。然后取最小值;
public int nthUglyNumber(int n) {
if (n < 1) return -1;
int[] dp = new int[n+1];
dp[1] = 1;
int idx = 1;
int u2 = 1, u3 = 1, u5 =1;
while (idx < n) {
dp[++idx] = Math.min(dp[u2]*2, Math.min(dp[u3]*3, dp[u5]*5));
if (dp[u2]*2 == dp[idx]) u2++;
if (dp[u3]*3 == dp[idx]) u3++;
if (dp[u5]*5 == dp[idx]) u5++;
}
return dp[n];
}
题不是很难,但是分析问题的方法很重要,分析问题的方式很重要。