题目描述:728. 自除数 - 力扣(LeetCode)
自除数 是指可以被它包含的每一位数整除的数。
- 例如,
128是一个 自除数 ,因为128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。自除数 不允许包含 0 。
给定两个整数
left和right,返回一个列表,列表的元素是范围[left, right]内所有的 自除数 。
解题思路:
判断一个数是否是自除数:
利用取余操作符获得一个数的每一位,再用这个数除以获得每一个位,如果有一位不能被整除,这个数就不是自除数;反之,是自除数。
再利用循环就可以解答该题。
代码:
int* selfDividingNumbers(int left, int right, int* returnSize)
{
int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
int j = 0;
int count = 0;
for (int i = left; i <= right; i++)
{
// 获得每一位数字,并判断
int rem = i;
int flag = 1;
while (rem)
{
int temp = rem % 10;
if (i % temp != 0)
flag = 0;
rem /= 10;
}
if (flag != 0)
{
arr[j++] = i;
count++;
}
}
*returnSize = count;
return arr;
}
下面是我再解答这道题所犯的错误,读者可选择不看。
- 第一个
int* selfDividingNumbers(int left, int right, int* returnSize)
{
int* arr = (int*)malloc(sizeof(int) * (right - left + 1));
int j = 0;
int count = 0;
for (int i = left; i <= right; i++)
{
// 获得每一位数字,并判断
int rem = i;
int flag = 1;
while (i)
{
int temp = i % 10;
if (rem % temp != 0)
flag = 0;
i /= 10;
}
if (flag != 0)
{
arr[j] = rem;
j++;
count++;
}
}
*returnSize = count;
return arr;
}
代码中的错误在于 while (i) 的循环条件。你在外层的 for 循环中使用了 i,而在内层的 while 循环中再次使用了 i。这导致了 for 循环中的 i 在内层循环中被改变,进而影响了外层的循环。
你应该在内层的 while 循环中使用另一个变量来保存数字的副本,而不是直接修改循环变量 i
- 第二个

这个错误的原因是,我在 i % temp != 0 中没有考虑到 temp 可能为0的情况。当 temp 为0时,会导致整数除以0的异常,因此需要在判断条件中加入 temp == 0 的判断,以避免出现除以0的情况。
具体来说,当 temp 为0时,应该跳过检查,因为整数除以0是非法的操作。这就是为什么你需要在判断条件中包括 temp == 0 的原因。
所以,在判断是否是自除数的部分,应该将条件改为 temp == 0 || i % temp != 0,这样可以避免出现除以0的异常情况。










![[LeetCode111双周赛LeetCode359周赛] DP双指针](https://img-blog.csdnimg.cn/c17d9f8164d4447f87a5288aa724b9dd.png)








