题目描述
丑数 就是只包含质因数 2、3 和 5 的正整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。
问题分析
有两种方法可以求解此问题,一种是,通过素数筛筛选出所有小于等于n的素数,然后对这些素数一一验证是否是n的因子,如果是n的因子,判断是否为2、3、5.这样最终就能知道此数是否为丑数。
第二种方法是,根据算术基本定理,任何一个数都可以分解成素数的乘积的形式即n=p1x1∗p2x2∗p3x3∗p4x4∗......n = p_1^{x_1}*p_2^{x_2}*p_3^{x_3}*p_4^{x_4}*......n=p1x1∗p2x2∗p3x3∗p4x4∗......也就是说,如果一个数是丑数那么此数必定可以写作n=2x1∗3x2∗5x3n = 2^{x_1}*3^{x_2}*5^{x_3}n=2x1∗3x2∗5x3也就是说,n在有限次除去2、3、5之后必定为1,所以就可以根据此来判读是否为丑数。
代码
方法一:会超时
bool isUgly(int n) {
if(n<1){
return false;
}
int *num = (int *)malloc(sizeof(int)*(n+1));
for(int i = 0; i <= n; i++){
num[i] = 1;
}
for(int i=2; i<=n; i++){
if(num[i]!=0){
if(n%i==0&&i!=2&&i!=3&&i!=5){
return false;
}
for(int j = i*2; j<=n; j+=i){
num[j] = 0;
}
}
}
return true;
}
方法二:不会超时
bool isUgly(int n) {
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;
}