题目来源:链接: [https://leetcode-cn.com/problems/self-dividing-numbers/].
728.自除数
1.问题描述
自除数 是指可以被它包含的每一位数除尽的数。
例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。
还有,自除数不允许包含 0 。
给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
注意:
- 每个输入参数的边界满足 1 <= left <= right <= 10000。
示例1:
输入:
上边界left = 1, 下边界right = 22
输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]
2.我的解决方案
一开始的思路是 将数字转换成 字符串,用的 是 itoa() 函数:将整型值转换为字符串, 但是执行的时候报错,应该是头文件的问题。
接下来的思路是 求出 每一位的数字,然后 除以这个数。
实现的时候有点小麻烦。。。
以后会牢记的,感觉还是平时用的少~
代码如下:
class Solution {
public:
vector<int> selfDividingNumbers(int left, int right) {
vector<int> res;
for(int i = left; i <= right; i++)
{
int tmp = i;
int flag = 1;
while(tmp)
{
int demo = tmp % 10;
if(demo == 0)
{
flag = 0;
break;
}
if(i % demo != 0)
{
flag = 0;
break;
}
tmp = tmp / 10;
}
if(flag)
{
res.push_back(i);
}
}
return res;
}
};
执行用时 : 12 ms, 在Self Dividing Numbers的C++提交中击败了15.70% 的用户
内存消耗 : 8.4 MB, 在Self Dividing Numbers的C++提交中击败了0.00% 的用户
3.大神们的解决方案
思路都差不多。。。
class Solution {
public:
vector<int> selfDividingNumbers(int left, int right) {
vector<int> ret;
for (int i = left; i <= right; ++i) {
if (isSelfDividingNumbers(i))
ret.push_back(i);
}
return ret;
}
bool isSelfDividingNumbers(int num) {
int n = num;
while(n) {
if (n %10 == 0)
return false;
if (num % (n % 10) != 0)
return false;
n /= 10;
}
return true;
}
};
4.我的收获
基础要扎实啊啊 啊啊啊
2019/3/10 胡云层 于南京 18