zltzlt 发表于 2020-3-17 13:33:00

Python:每日一题 354

今天的题目:

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

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

给定正整数 left 和 right,返回一个列表,列表的元素是 left ~ right 内(包含 right)所有的自除数。

说明:0 不是自除数。

示例 :

输入: left = 1, right = 22
输出:

{:10_298:}欢迎大家一起答题!{:10_298:}

一个账号 发表于 2020-3-17 13:45:19

本帖最后由 一个账号 于 2020-3-17 17:06 编辑

def func(left, right):
    result = []
    temp = []
    for i in range(left, right+1):
      if i != 0 and "0" not in str(i):
            for j in set(str(abs(i))):
                if i % int(j) != 0:
                  temp.append(False)
            if all(temp):
                result.append(i)
            temp.clear()
    return result

塔利班 发表于 2020-3-17 13:56:16

本帖最后由 塔利班 于 2020-3-17 17:25 编辑

def f354(l,r):
    res=[]
    for i in range(l,r+1):
      s=str(i)
      if '0' not in s:
            for e in map(int,set(s)):
                if i%e:
                  break
            else:
                res.append(i)
    return res

ouyunfu 发表于 2020-3-17 14:20:46

def f354(left,right):
    L=[]
    for i in range(left,right+1):
      if '0' not in str(i):
            if sum()==0:
                L.append(i)
    return L

print(f354(1,22))

ouyunfu 发表于 2020-3-17 14:22:47

def f354(left,right):
    return )==0]

永恒的蓝色梦想 发表于 2020-3-17 14:38:49

本帖最后由 永恒的蓝色梦想 于 2020-3-17 15:29 编辑

两个版本,加了注释

方法一:class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List:
      result=[]
      for num in range(left,right+1):
            for char in str(num): #遍历转化为字符串的num
                if char=='0' or num%int(char): #如果这一位是0,或者这一位不能整除原始值,退出循环而不执行else
                  break
            else:
                result.append(num) #如果没有break,这个数就是自除数
      return result方法二:class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List:
      result=[]
      for num in range(left,right+1):
            original=num #保存原始值
            while num: #如果num为0,退出循环执行else
                if not(digit:=num%10) or original%digit: #如果这一位是0,或者这一位不能整除原始值,退出循环而不执行else
                  break
                num//=10 #推到下一位
            else:
                result.append(original) #如果没有break,这个数就是自除数
      return result

kinkon 发表于 2020-3-17 14:39:34

本帖最后由 kinkon 于 2020-3-17 22:59 编辑

暴力一下
def f354(left, right):
    rec, cout = [], 0
    for i in range(left, right + 1):
      tmpI = str(i)
      if '0' in tmpI:
            continue
      if len(set(tmpI)) == 1:
            rec.append(i)
            continue                     
      for j in tmpI:
            if i % int(j):
                break
      else:               
            rec.append(i)            
    return rec

TJBEST 发表于 2020-3-17 14:41:49

占个前排,四六二十四的题真的价值不高

mdphd 发表于 2020-3-17 14:48:00

本帖最后由 mdphd 于 2020-3-17 15:35 编辑

def zcs(x):
    a = list(set(str(x)))
    a.sort(reverse = True)
    b = 1
    if '0' not in a:
      for each in a:
            if x % int(each) != 0:
                b = 0
                break
      if b == 1:
            return x

def f354(A,B):
    g = map(zcs, range(A, B + 1))
    c = list(filter(None, list(g)))
    return c
不算高效{:10_304:}

永恒的蓝色梦想 发表于 2020-3-17 14:59:05

TJBEST 发表于 2020-3-17 14:41
占个前排,四六二十四的题真的价值不高

这题是力扣的

永恒的蓝色梦想 发表于 2020-3-17 15:24:46

mdphd 发表于 2020-3-17 14:48
不算高效

直接a = set(str(a))就好了,为什么要a = list(set(list(str(x))))
a.sort(reverse = True)呢?

蒋博文 发表于 2020-3-17 15:30:58

def fun354(left, right):
    result=[]
    for i in range(left,right + 1):
      a = str(i)
      if '0' in a:
            continue
      else:
            list1 = []
            for j in a:
                list1.append(i % int(j) == 0)
            if all(list1):
                result.append(i)
    return result

mdphd 发表于 2020-3-17 15:33:29

永恒的蓝色梦想 发表于 2020-3-17 15:24
直接就好了,为什么要呢?

{:10_245:}我刚学,各种用法都不太熟,感谢指教!

阴阳神万物主 发表于 2020-3-17 16:17:51

“0 不是自除数。”的说明,是没有必要的。因为正整数不包括 0.

l0stparadise 发表于 2020-3-17 16:18:50

def f354(left,right):
    list1=[]
    def seek_num(num):
      if 0 < num < 10:
            return True
      if "0" in str(num):
            return False
      for each_num in str(num):
            if num%int(each_num):
                return False
      else:
            return True
    for i in range(left,right+1):
      if seek_num(i):
            list1.append(i)
    return list1

阴阳神万物主 发表于 2020-3-17 16:31:37

本帖最后由 阴阳神万物主 于 2020-3-17 16:32 编辑

难度评级:简单
要素分析:数论
代码:
def solve(left:int,right:int)->list:
    def getn():
      for num in range(left,right+1):
            n = set(str(num))
            if '0' in n:
                continue
            if len(n) == 1:
                yield num
                continue
            for i in n:
                if num%int(i):
                  break
            else:
                yield num
    return list(getn())
if __name__ == '__main__':
    print('示例 输出:',solve(1,22))

TJBEST 发表于 2020-3-17 16:50:27

阴阳神万物主 发表于 2020-3-17 16:31
难度评级:简单
要素分析:数论
代码:

问一下 这样使用生成器 功能是什么?直接用列表记录不一样吗?内存中都得生成列表啊{:5_109:}返回的是列表

永恒的蓝色梦想 发表于 2020-3-17 16:54:29

本帖最后由 永恒的蓝色梦想 于 2020-3-17 17:00 编辑

TJBEST 发表于 2020-3-17 16:50
问一下 这样使用生成器 功能是什么?直接用列表记录不一样吗?内存中都得生成列表啊返回的是列 ...

我个人认为这个闭包也没有什么意义……{:10_248:}

黎影 发表于 2020-3-17 16:58:06

本帖最后由 一个账号 于 2020-3-17 17:18 编辑

left = int(input('输入:\nleft = '))
right = int(input('right = '))

list1 = []
for i in range(left,right+1):
    str1 = str(i)
    if '0' in str1:
      continue
    else:
      for j in str1:
            number = int(j)
            if i % number != 0:
                break
      else:
            list1.append(i)
print(list1)

coolsummer2080 发表于 2020-3-17 17:17:45

一个账号 发表于 2020-3-17 13:45


真是很厉害!很巧妙!
页: [1] 2 3 4 5 6
查看完整版本: Python:每日一题 354