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]; }
题不是很难,但是分析问题的方法很重要,分析问题的方式很重要。