一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
一、问题描述
**丑数 ** 就是只包含质因数 2
、3
和 5
的正整数。
给你一个整数 n
,请你判断 n
是否为 **丑数 ** 。如果是,返回 true
;否则,返回 false
。
题目链接:丑数 l
二、题目要求
样例 1
输入: n = 6
输出: true
解释: 6 = 2 × 3
复制代码
样例 2
输入: n = 1
输出: true
解释: 1 没有质因数,因此它的全部质因数是 {2, 3, 5} 的空集。
复制代码
考察
1.贪心、模拟
2.建议用时15~35min
复制代码
三、问题分析
这一题其实简单判断就行了,比如我一开始的想法就是看看这个数字能否被若干个 2 3 5相乘得到,如果可以的话,就返回true
,否则返回false
。
我最初写的代码有点长,但很容易理解。
后来发现,这种方法还可以优化,三重循环嵌套太差劲了。
优化
思想还是这一个思想,只不过是把三重循环分成各自独立的。
1.n是2的倍数,进入循环/2
2.n是3的倍数,进入循环/3
3.n是5的倍数,进入循环/5
复制代码
四、编码实现
1.初始版本
class Solution {
public:
bool isUgly(int n) {//(●>ω<●)
int i,j,k,a,b,c;//初始化数据
for(i=0;pow(2,i)<=n;i++)//判断有几个2
{
a=pow(2,i);
for(j=0;pow(3,j)<=n/a;j++)//判断有几个3
{
b=pow(3,j);
for(k=0;pow(5,k)<=n/(a*b);k++)//判断有几个5
{
c=pow(5,k);
if(a*b*c==n)//如果能够构成,返回true
return true;
}
}
}
return false;//不能构成,返回false
}
};
复制代码
2.优化后
class Solution {
public:
bool isUgly(int n) {
if(n<1) return false;//n为0,返回false
while(n%2==0) n=n/2;//进入2循环
while(n%3==0) n=n/3;//进入3循环
while(n%5==0) n=n/5;//进入5循环
if(n==1)//结果是1,那么肯定能被2 3 5组成
return true;
else//否则不能
return false;
}
};
复制代码
五、测试结果
优化后的执行用时明显低了。