探索自除数:发现区间内的神奇数字

探索自除数:发现区间内的神奇数字_第1张图片

本篇博客会讲解力扣“728. 自除数”的解题思路,这是题目链接。

探索自除数:发现区间内的神奇数字_第2张图片
对于给定的正整数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;
}

探索自除数:发现区间内的神奇数字_第3张图片

总结

解决本题的关键是,如何取出任意整数的每一位。我们需要掌握一种常见的方法,即反复地mod10除10直到num变成0,每次mod10得到的余数就是num的每一位。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,数据结构,算法,leetcode,c语言,力扣)