题目描述:
写一个程序来检测一个整数是不是
丑数
。
丑数的定义是,只包含质因子
2, 3, 5
的正整数。比如 6, 8 就是丑数,但是 14 不是丑数以为他包含了质因子 7。
注意事项
可以认为
1
是一个特殊的丑数。
样例
给出 num =
8
,返回 true
。 给出 num = 14
,返回 false
。
解题思路:
由于num的因数只有2、3、5三个数字,因此只要将num连续除以2再连续除以3再连续除以5,如果最后的结果为1,那么可知该数符合条件。
代码如下:
/*丑数
*只包含质因子 2, 3, 5 的正整数
*/
public static boolean isUgly(int num) {
boolean b = false;
if (num == 1) {
b = true;
} else if(num > 1) {
while (num % 2 == 0) { // 连续除以2,直到num因数里不再含有2
num = num / 2;
}
if (num != 1) {
while (num % 3 == 0) { //连续除以3
num = num / 3;
}
if (num != 1) {
while (num % 5 == 0) { // 连续除以5
num = num / 5;
if(num == 1){
b = true;
break;
}
}
} else {
b = true;
}
} else {
b = true;
}
}
return b;
}
补充:丑数问题2
求按从小到大的顺序的第N个丑数。
求解思路:我们已知前四个丑数是1,2,3,5.由于后面的丑数的因子都只有2、3、5(不算自身和1),那么只要将2、3、5这三个丑数不断乘以2、3、5,取最小值作为下一个丑数即可。
代码如下:
public int GetUglyNumber_Solution(int index) {
int re = 0;
if (index == 0) {
return 0;
} else {
ArrayList<Integer> res = new ArrayList<Integer>();
res.add(1);
int i2 = 0, i3 = 0, i5 = 0;
while (res.size() < index) {
int num2 = res.get(i2) * 2;
int num3 = res.get(i3) * 3;
int num5 = res.get(i5) * 5;
int min = Math.min(num3, Math.min(num2, num5));
res.add(min);
if (min == num2) {
i2++;
}
if (min == num3) {
i3++;
}
if (min == num5) {
i5++;
}
}
return res.get(res.size() - 1);
}
}