说实话一开始曲解意思了,方法1虽丑但是实用,如果一个数的两个因子,其中有一个是质数,而且不是235的话就直接false
方法2是很好的方法,因为丑数不只是质因数为235,可以说它的因数只有235,30这个丑数,虽然有一对因数为2,15,但是15最后也会被拆分成35。
所以我们可以把丑数认为是2i+3j+5k这样的,如果n可以整除2就一直整除,然后再对3和5做相同的操作,判断最后n是否为1就行了,为1证明是由这三个数字相乘得来的。
1是第一个丑数,负数以及0不是丑数
class Solution {
public:
// bool isPrime(int x){
// if(x <= 1) return false;
// int Sqrt = (int)sqrt(x);
// for(int i = 2; i <= Sqrt; ++i){
// if(x % i == 0) return false;
// }
// return true;
// }
bool isUgly(int n) {
//判断n的因数中是否有除了235的质数
// if(n == 1) return true;
// if(n <= 0) return false;
// for(int i = 1; i <= (int)sqrt(n); ++i){
// if(n%i == 0){
// if(isPrime(i) && i != 2 && i != 3 && i != 5) return false;
// if(isPrime(n/i) && n/i != 2 && n/i != 3 && n/i != 5) return false;
// }
// }
// return true;
//法二:迭代
//负数和0全不是丑数,它们没资格!
//丑数的定义是它可以有别的因数,但是质因数只能有2,3,5,那些因数也统统由丑数组成,比如30,可以由2*15组成,但是15是由3*5组成的
//所以丑数只能由这3个数相乘得出,就是2*i+3*j+5*k
if(n < 1) return false;
while(n % 2 == 0) n/=2;
while(n % 3 == 0) n/=3;
while(n % 5 == 0) n/=5;
return n == 1;
}
};