鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

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

[复制链接]
发表于 2020-3-17 17:39:44 | 显示全部楼层
本帖最后由 fan1993423 于 2020-3-17 17:41 编辑

这道题思路很容易想到,但考虑到是效率题,所以还是要从效率入手。在323055,41520421这数据,我测了下是14秒,比其他鱼油快点,部分鱼油解答不出来这个数据。估计又要被版主说超时了。已经想好了这一步了。如果有优化空间在发上来。
from bisect import bisect,bisect_left
from math import gcd
from functools import reduce
def get_lcm(lst):
    return reduce(lambda a,b:a*b//gcd(a,b),lst)
def get_test(num):
    for i in str(num):
        if num% int(i):return False
    return True
a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22, 24, 33, 36, 44, 48, 55, 66, 77, 88, 99, 111, 112, 115, 122, 124, 126, 128, 132, 135, 144, 155, 162, 168, 175, 184, 212, 216, 222, 224, 244, 248, 264, 288, 312, 315, 324, 333, 336, 366, 384, 396, 412, 424, 432, 444, 448, 488, 515, 555, 612, 624, 636, 648, 666, 672, 728, 735, 777, 784, 816, 824, 848, 864, 888, 936, 999]
right_n=[]
def fun354(left,right):
    if right<1000:
        return  a[bisect_left(a,left):bisect(a,right)]
    elif left<1000 and right>1000:
        b=right//1000
        for i in range(1,b+1):
            if '0' not in str(i):
                right_lcm=get_lcm(list(map(int,str(i))))
            for j in range(i*1000+111,(i+1)*1000):
                if '0' not in str(j) and get_test(j):
                    break
            for k in range(j,(i+1)*1000,right_lcm):
                if '0' not in str(k) and get_test(k) and k<=right:
                    right_n.append(k)
        return a[bisect_left(a,left):]+right_n
    else:
        b=right//1000
        c=left//1000
        for i in range(c,b+1):
            if '0' not in str(i):
                right_lcm=get_lcm(list(map(int,str(i))))
            for j in range(i*1000+111,(i+1)*1000):
                if '0' not in str(j) and get_test(j):
                    break
            for k in range(j,(i+1)*1000,right_lcm):
                if '0' not in str(k) and get_test(k) and k<=right and k>=left:
                    right_n.append(k)
        return right_n

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 17:46:19 | 显示全部楼层
本帖最后由 whosyourdaddy 于 2020-3-17 17:49 编辑

def func354(left,right):
    result = []
    temp = 0
    for i in range(left,right+1):
        s = str(i)
        if '0' not in s:
            for j in set(s):
                if i%int(j) !=0:
                    temp = 1
                    break
            if temp == 1:
                temp = 0
            else:
                result.append(i)
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 17:50:19 | 显示全部楼层
fan1993423 发表于 2020-3-17 17:39
这道题思路很容易想到,但考虑到是效率题,所以还是要从效率入手。在323055,41520421这数据,我测了下是14 ...

悄悄告诉你:不用字符串快一倍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 18:15:24 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-17 17:50
悄悄告诉你:不用字符串快一倍

用什么,我还可以改,反正版主还没测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 18:43:11 | 显示全部楼层
本帖最后由 uune 于 2020-3-17 18:44 编辑
def f354(x,y):
    z = []
    for i in range(x,y):
        a = i%10    #个位数
        b = i//10   #十位数
        if i<10:
            z.append(i)
        elif a==0:
            pass
        elif i//a == i/a and i//b == i/b:
                z.append(i)
    return print(z)

f354(1,100)
人笨,求指正

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 19:16:03 | 显示全部楼层
def test354(left,right):
    result=[]
    for i in range(left ,right+1):
        temp=i
        length=len(str(temp))
        while length:
            k=temp//(10**(length-1))
            if k!=0:
                if i%k==0:
                    temp=temp%(10**(length-1))
                    length-=1
                else:
                    break
            else:
                break
        else:
            result.append(i)

    return result

g=test354(323055,41520421)
print(g)
答一个

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 19:16:39 | 显示全部楼层
fan1993423 发表于 2020-3-17 18:15
用什么,我还可以改,反正版主还没测试

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

使用道具 举报

发表于 2020-3-17 20:02:49 | 显示全部楼层
本帖最后由 风魔孤行者 于 2020-3-17 20:26 编辑
def function(left,right):
    list1 = []
    def f(n):
        a = n
        while a >0:
            b = a%10
            if (b == 0) or (n%b !=0):
                return False
                #break
            a = a//10
        return True
    for a in range(left,right+1):
        if f(a):
            list1.append(a)
    return list1
终于有做的来的题目了

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 21:32:30 | 显示全部楼层
def fun354(left, right):
    result = []
    while left < (right + 1):
        if judge(left):
            result.append(left)
        left += 1
    print(result)

def judge(left):
    list1 = list(str(left))
    length = len(list1)
    active = 1
    i = 1
    while i < (length+1):
        divisor =int(list1[i-1])
        if divisor == 0:
            active = 0
        elif left % divisor != 0:
            active = 0
        i  += 1
    return active

fun354(1,22)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 22:02:12 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-17 22:34 编辑
def q354(left, right):
    DivSelf = []    
    for each in range(left, right+1):
        if '0' not in str(each):
            setDS = set(str(each))            
            count = 1
            for key in setDS:
               count *= int(key)
            if each%count == 0:
                DivSelf.append(each)
    return DivSelf
我把学习的六楼的‘:=’  借过来用用 哈哈
left = 323055
right = 41520421
        
    
def q354(left, right):
    DivSelf = []    
    for each in range(left, right+1):
        if '0' not in (string := str(each)):                        
            count = 1
            for key in (setDS := set(string)):
               count *= int(key)
            if each%count == 0:
                DivSelf.append(each)
    return DivSelf
                
                
print(q354(left, right))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-17 22:31:35 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-17 14:38
两个版本,加了注释

方法一:方法二:

海象运算符是个好东西,受教啦~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 22:42:13 | 显示全部楼层
sYMMetrY 发表于 2020-3-17 22:31
海象运算符是个好东西,受教啦~~~
我把学习的六楼的‘:=’  借过来用用 哈哈
left = 323055
right = 41520421
        
    
def q354(left, right):
    DivSelf = []    
    for each in range(left, right+1):
        if '0' not in (string := str(each)):                        
            count = 1
            for key in set(string):
               count *= int(key)
            if each%count == 0:
                DivSelf.append(each)
    return DivSelf
                
                
print(q354(left, right))
你创建了setDS变量,然后就一次也没用过,给你改了改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 23:31:51 | 显示全部楼层
本帖最后由 wuqramy 于 2020-3-18 09:12 编辑
left = input('left = ')
right = input('right = ')
num = [str(x) for x in range(int(left),int(right)+1)]
reault=[]
n=0
for each in num:
    for i in range(len(each)):
        if not int(each[i]) or (int(each) % int(each[i])):
            reault.append(n)
            break
    n+=1
for i in range(len(reault)-1,-1,-1):
    del num[reault[i]]
print (num)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-18 00:08:11 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-17 22:42
你创建了setDS变量,然后就一次也没用过,给你改了改

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

使用道具 举报

发表于 2020-3-18 00:44:53 | 显示全部楼层
def func(left,right):
    res=[]
    for i in range(left,right+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荣誉 -3 鱼币 -3 收起 理由
zltzlt -3 -3 禁止抄袭

查看全部评分

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

使用道具 举报

发表于 2020-3-18 09:04:34 | 显示全部楼层
left,right = map(int,input().split())
list1 = []
result = []
def zhuan(n):
    if n > 0:
        list1.insert(0,n%10)
        zhuan(n//10)
for i in range(left,right+1):
    zhuan(i)
    for j in list1:
        if j == 0 or i%j != 0:
            break
    else:
        result.append(i)
    list1.clear()
print(result)
好像我的最长

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-18 09:39:49 | 显示全部楼层
def self_mod(left, right):
    output = []
    for num in range(left, right+1):
        j = 0
        num_ope = str(num)
        if num_ope.find("0", 1) == -1:
            while j < len(num_ope):
                if num % int(num_ope[j]):
                    break
                j += 1
            else:
                output.append(num)
    return output


print(self_mod(1, 22))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-18 11:23:17 | 显示全部楼层
楼主 我昨天有事没写,下午写行吗?先别关闭题目,我有两种方法。一个暴力的,一个麻烦的。您给受累测一下啊。下午四点之前都能发上去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-18 13:01:07 | 显示全部楼层
TJBEST 发表于 2020-3-18 11:23
楼主 我昨天有事没写,下午写行吗?先别关闭题目,我有两种方法。一个暴力的,一个麻烦的。您给受累测一下 ...

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

使用道具 举报

发表于 2020-3-18 14:01:47 | 显示全部楼层
第一种暴力方法,稍后来个另类的
def fun354(left,right):
    def num2digital(num):
        result = []
        while num:
            result.append(num%10)
            num = num // 10
        result.reverse()
        return result
    def GongBei(iterobj):
        result = 1
        for each in iterobj:
            result = result*each//Gongyue(result,each)
        return result
    def Gongyue(a,b):
        if a<b:
            a,b = b,a
        while b:
            a,b = b,a%b
        return a
    result = []
    for index in range(left,right+1):
        arr = num2digital(index)
        if 0 not in arr:
            if index % GongBei(set(arr))==0:
                result.append(index)
            else:
                pass
        else:
            pass
    return result

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-19 14:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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