LeetCode263-丑数(数学智力题)
看了答案才发现,这个题目这么简单。
这个题目隐含的意思很坑,
除了2、3、5,不能有别的质数了,比如2x7 = 14,7是质数,不行。
2x25可以 因为25不是质数
所以我就想到
一个数,看能否被2整除,如果可以
1、这个商是质数吗? 如果是质数,那么是2、3、5吗?是就是true,不是就是false
2、如果不是质数,就判断这个商是不是丑数。递归
后面对3和5也是这样处理。
首先是判断质数的方法
就是num%i 一直到根号nums
https://blog.csdn.net/huang_miao_xin/article/details/51331710
在网上,多了一种方法。
如果一个数 不是6的倍数相邻的数,肯定不是质数。 不能反推
public class LeetCode263 { public static void main(String[] args) { System.out.println(isUgly(50)); } public static boolean isPrime(int n){ if (n==1||n==2||n==3||n==5) return true; if(!(n%6==1||n%6==5)){ return false; } int temp = (int)Math.sqrt(n); //必须是=,不然25,可以55 25 for(int i=2;i<=temp;i++){ if (n%i==0) return false; } return true; } public static boolean isUgly(int num) { if(num<=0) return false; if (num==1||num==2||num==3||num==5) return true; boolean result = false; if(num%2==0){ //如果是质数,看是不是2、3、5 int temp = num/2; if(isPrime(temp)){ if(temp==2||temp==3||temp==5){ return true; }else { return false; } }else { //如果不是质数,那看看这个数是不是丑数 result = isUgly(num/2); } } if (result){ return true; }else { if(num%3==0){ //如果是质数,看是不是2、3、5 int temp = num/3; if(isPrime(temp)){ if(temp==2||temp==3||temp==5){ return true; }else { return false; } }else { result = isUgly(num/3); } } } if (result){ return true; }else { if(num%5==0){ //如果是质数,看是不是2、3、5 int temp = num/5; if(isPrime(temp)){ if(temp==2||temp==3||temp==5){ return true; }else { return false; } }else { result = isUgly(num/5); } } } return result; } }
太慢了
其实忘了一个条件,这个商,肯定也是2、3、5组合得来的。
所以丑数就是
2a x 3b x 5c
只有这里面,没有别的质数就好了。但是2、3、5构成的,怎会是质数呢?
所以最后就是
public boolean isUgly(int num) { if(num<=0) return false; if(num==1) return true; while(num%2==0) num/=2; while(num%3==0) num/=3; while(num%5==0) num/=5; return (num==1)?true:false; }