1952. 三除数
题目描述
给你一个整数 n 。如果 n 恰好有三个正除数 ,返回 true ;否则,返回 false 。
如果存在整数 k ,满足 n = k * m ,那么整数 m 就是 n 的一个 除数 。
示例 1:
输入:n = 2 输出:false 解释:2 只有两个除数:1 和 2 。
示例 2:
输入:n = 4 输出:true 解释:4 有三个除数:1、2 和 4 。
提示:
1 <= n <= 104
解法
方法一:枚举
思考
恰有三个正因数的数必为某个素数的平方。\(n\) 不大,枚举 \(2\) 到 \(n-1\) 统计中间因数个数是否为 \(1\) 即可判定。
一个数 \(n\) 一定有 \(1\) 和 \(n\) 两个正除数,因此只需要枚举 \(2\) 到 \(n-1\) 之间的数,看它们是否是 \(n\) 的正除数即可,是则累加计数器,最后判断计数器是否为 \(1\) 即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(1)\)。其中 \(n\) 为给定的整数。
1 2 3 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
方法二:枚举优化
思考
线性枚举在 \(n\) 接近上限时偏慢。改为枚举到 \(\sqrt{n}\),每找到因数对计数加二(平方时加一),判断总数是否为 \(3\)。
我们可以枚举 \(1\) 到 \(\sqrt{n}\) 之间的数 \(i\),如果 \(n\) 能被 \(i\) 整除,并且 \(\frac{n}{i}\) 不等于 \(i\),那么计数器累加 \(2\),否则计数器累加 \(1\)。最后判断计数器是否为 \(3\) 即可。
时间复杂度 \(O(\sqrt{n})\),空间复杂度 \(O(1)\)。其中 \(n\) 为给定的整数。
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |