鱼C论坛

 找回密码
 立即注册
查看: 4885|回复: 105

[已解决]Python:每日一题 354

[复制链接]
发表于 2020-3-17 13:33:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


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

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

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

说明:0 不是自除数。

示例 :

输入: left = 1, right = 22
输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22]


欢迎大家一起答题!
最佳答案
2020-3-18 18:03:20
def q354(left,right):
    result = []
    for each in range(left,right+1):
        a, b= each%10, each
        while  b:
            if not a:
                break
            elif each%a:
                break
            else:
                b //= 10
                a = b%10
        else:
            result.append(each)
    return result

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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([i%int(j) for j in str(i)])==0:
                L.append(i)
    return L

print(f354(1,22))

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 14:22:47 | 显示全部楼层
def f354(left,right):
    return [i for i in range(left,right+1) if '0' not in str(i) if sum([i%int(j) for j in str(i)])==0]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-17 14:38:49 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-17 15:29 编辑

两个版本,加了注释

方法一:
class Solution:
    def selfDividingNumbers(self, left: int, right: int) -> List[int]:
        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[int]:
        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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-17 14:41:49 | 显示全部楼层
占个前排,四六二十四的题真的价值不高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
不算高效

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 14:59:05 | 显示全部楼层
TJBEST 发表于 2020-3-17 14:41
占个前排,四六二十四的题真的价值不高

这题是力扣的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 15:24:46 | 显示全部楼层

直接
a = set(str(a))
就好了,为什么要
a = list(set(list(str(x))))
a.sort(reverse = True)
呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 15:33:29 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-17 15:24
直接就好了,为什么要呢?

我刚学,各种用法都不太熟,感谢指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 16:17:51 | 显示全部楼层
“0 不是自除数。”的说明,是没有必要的。因为正整数不包括 0.

评分

参与人数 1荣誉 +1 收起 理由
永恒的蓝色梦想 + 1 有道理

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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))

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 16:50:27 | 显示全部楼层
阴阳神万物主 发表于 2020-3-17 16:31
难度评级:简单
要素分析:数论
代码:

问一下 这样使用生成器 功能是什么?直接用列表记录不一样吗?内存中都得生成列表啊返回的是列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 16:54:29 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-17 17:00 编辑
TJBEST 发表于 2020-3-17 16:50
问一下 这样使用生成器 功能是什么?直接用列表记录不一样吗?内存中都得生成列表啊返回的是列 ...


我个人认为这个闭包也没有什么意义……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 17:17:45 | 显示全部楼层

真是很厉害!很巧妙!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-11 11:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表