题目描述: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的异常情况。