完美数,自除数

完美数

对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。

给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False

示例:

输入: 28
输出: True
解释: 28 = 1 + 2 + 4 + 7 + 14

提示:

输入的数字 n 不会超过 100,000,000. (1e8)

class Solution {
    public boolean checkPerfectNumber(int num) {
        /*
        1.奇数肯定不是完美数
        2.对于数字28,可以判断2-28/2范围内的可以整除的数,然后加起来看是否和28相等
        上面的方法逐个判断有冗余,因为28%2=0,28%14=0,判断了2次,我们可以减少为一次判断
        具体的,当我们知道28%2=0之后,将28/2=14的结果也保存下来,这样就不用在判断是否可以被14整除了。
         for(int i = 2; i < num / i; i++) 当i=2时,i<28/2=14,这样就排除了14
         以这种方式每次将区间的范围缩小为 i~num/i,时间O(logn)
        */
        if(num % 2 != 0) return false;
        
        int tmp = 1;
        for(int i = 2; i < num / i; i++){
            if(num % i == 0){
                tmp += i + num / i;
            }
        }
        
        return tmp == num;
    }
}

作者:hjs-5
链接:https://leetcode-cn.com/problems/perfect-number/solution/javati-jie-by-hjs-5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自除数 是指可以被它包含的每一位数除尽的数。

例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。

还有,自除数不允许包含 0 。

给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。

示例 1:

输入:
上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
注意:

每个输入参数的边界满足 1 <= left <= right <= 10000。

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
        /*
        依次取下num中的每一位,然后判断是否自除数:
        1.如果为0,则肯定不是自除数,因为不能除以0
        2.如果不为0,则用原来的数对刚取下的最后一个数取模
        */
        List<Integer> res = new ArrayList<>();
        
        int len = right - left + 1;
        int tmp= left;
        for(int i = left; i < right + 1; i++){
            if(isDividingNumber(i)){
                res.add(i);    
            }
        }
        
        return res;
        
    }
    
    public boolean isDividingNumber(int num){
        int tmp = 0;
        int n = num;
        while(num > 0){
            tmp = num % 10;
            
            if(tmp == 0 || n % tmp != 0){
            
                return false;
            }
            num /= 10;
        }
        return true;
    
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值