完美数
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。
给定一个 整数 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;
}
}