今天和大家聊的问题叫做 完美数,我们先来看题面:https://leetcode-cn.com/problems/next-greater-element-ii/
A perfect number is a positive integer that is equal to the sum of its positive divisors, excluding the number itself. A divisor of an integer x is an integer that can divide x evenly.
Given an integer n, return true if n is a perfect number, otherwise return false.
对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。给定一个 整数 n, 如果是完美数,返回 true,否则返回 false
示例
示例 1: 输入:num = 28 输出:true 解释:28 = 1 + 2 + 4 + 7 + 14 1, 2, 4, 7, 和 14 是 28 的所有正因子。 示例 2: 输入:num = 6 输出:true 示例 3: 输入:num = 496 输出:true 示例 4: 输入:num = 8128 输出:true 示例 5: 输入:num = 2 输出:false
解题
这里要注意,num最大可以取到10^8,所以不能是O(n)的时间复杂度(会超时)。
可以借鉴求质数的思想,如果i是num的因子,那么nums / i也是nums的因子,因此我们只需要枚举2~sqrt(num)即可,这样时间复杂度就是O(sqrt(n))。另外还要注意,枚举的时候,1要单独处理,也是说num为1的情况需要特判,然后枚举因子的时候从2枚举到sqrt(num)即可。
class Solution { public: bool checkPerfectNumber(int num) { if(num == 1) { return false; } int sum = 0; // sum表示num所有因子的和 for(int i = 2; i <= num / i; ++i) { if(num % i == 0) { sum += i; if(i != num / i) { // 当i不等于sqrt(num)且i是num的因子时,num / i也是num的一个因子 sum += num / i; } } } if(sum + 1 == num) { // 这里+1是因为1也是num的一个因子 return true; } return false; } };
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。