本篇博客会讲解力扣“728. 自除数”的解题思路,这是题目链接。
对于给定的正整数num,我们如何判断它是不是自除数呢?根据定义,我们只需要把num的每一位数字都取出来,判断能不能整除num,如果发现num的某一位数字时0或者无法整除num,就说明num不是自除数;反之,如果发现num的每一位数字都能整除num,就说明num是自除数。
那如何把num的每一位都取出来呢?这里介绍一种很常见的方法:反复进行“mod10除10”,即先mod10取出个位数,然后再除10把个位数去掉,反复进行这样的操作,就能取出num的每一位了。
bool isSelfDividing(int num){
int tmp = num;
// 取出每一位
while (tmp)
{
int digit = tmp % 10;
// 包含0或者不能被整除,则不是自除数
if (digit == 0 || num % digit)
{
return false;
}
tmp /= 10;
}
// 每一位都能整除
return true;
}
int* selfDividingNumbers(int left, int right, int* returnSize){
// 存储[left, right]的自除数
int* ret = (int*)malloc(sizeof(int) * (right - left + 1));
int pos = 0; // 记录写入的位置
for (int i = left; i <= right; ++i)
{
if (isSelfDividing(i))
{
ret[pos++] = i;
}
}
*returnSize = pos;
return ret;
}
总结
解决本题的关键是,如何取出任意整数的每一位。我们需要掌握一种常见的方法,即反复地mod10除10直到num变成0,每次mod10得到的余数就是num的每一位。
感谢大家的阅读!