LintCode.517.丑数
题目描述:
写一个程序来检测一个整数是不是丑数
。
丑数的定义是,只包含质因子 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); } }