编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数 2, 3, 5
的正整数。
示例 1:
输入: 6
输出: true
解释: 6 = 2 × 3
示例 2:
输入: 8
输出: true
解释: 8 = 2 × 2 × 2
我一开始的思路是求所给数字的所有质因数,然后把这个数字的质因数保存到一个数组中,如果这个数组中包含了除2,3,5还有其他数字,那就不是丑数,如果只有2,3,5那就为丑数。
很不幸,代码超时了。
class Solution {//超时
public boolean isUgly(int num) {
if(num <= 0)
return false;
int[] ans = new int[50];
int j=0;
for(int i =2; i<=num; i++){//短除法,求num的所有的质因数
while(num % i == 0 && num != i){
num = num /i;
ans[j++] = i;
}
if(num == i){
ans[j++]=i;
break;
}
}
for(int i=0 ;i<ans.length;i++){
System.out.println(ans[i]);
if(ans[i] == 2 || ans[i]==3 || ans[i]==5 || ans[i]==0)
continue;
else
return false;
}
return true;
}
}
看了看别的做法,恍然大悟。利用丑数只包含三个质因数的性质,说明丑数除以拥有的质因数时会逐渐到1,否则不是丑数。
class Solution {
public boolean isUgly(int num) {//6
if (num < 1)
return false;
while (num % 2 == 0)
num /= 2;//3
while (num % 3 == 0)
num /= 3;//1
while (num % 5 == 0)
num /= 5;
return num == 1;
}
}