题目来源于力扣(LeetCode)
一、题目
题目相关标签:数学
说明:
- 每个输入参数的边界满足
1 <= left <= right <= 10000
。
二、解题思路
-
遍历 left 到 right 元素,对每个数值元素进行判断
-
若遍历元素在 [1, 9] 区间内,加入结果集,一位数必定是自除数
-
对其他的元素,进行循环取个位数的操作,判断个位数上的元素是否不为 0 且能够被当前遍历元素整除
三、代码实现
public static List<Integer> selfDividingNumbers(int left, int right) {
List<Integer> list = new ArrayList<>();
for (int i = left; i <= right; i++) {
// 不能改变 i 的值,将 i 赋值给 num
int num = i;
// 1 ~ 9 加入结果集
if (num < 10) {
list.add(num);
continue;
}
// 对 i 进行取个位数的操作
while (num > 0) {
// 取个位数
int j = num % 10;
// 自除数中 位上的数字不为0,且每一位都能被该 i 整除
if (j == 0 || i % j != 0) {
break;
}
// 舍弃个位数
num = num / 10;
}
// num 能够被整除到 0,说明满足以上判断条件,加入结果集
if (num == 0) {
list.add(i);
}
}
return list;
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
int left = 1, right = 22; // output: {1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22}
List<Integer> result = selfDividingNumbers(left, right);
System.out.println(result);
}