Leetcode刷题18-728.自除数(C++)

题目来源:链接: [https://leetcode-cn.com/problems/self-dividing-numbers/].

1.问题描述

自除数 是指可以被它包含的每一位数除尽的数。

例如,128 是一个自除数,因为 128 % 1 == 0,128 % 2 == 0,128 % 8 == 0。

还有,自除数不允许包含 0 。

给定上边界和下边界数字,输出一个列表,列表的元素是边界(含边界)内所有的自除数。
注意:

  1. 每个输入参数的边界满足 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

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/88376568