鱼C论坛

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

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

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

这道题思路很容易想到,但考虑到是效率题,所以还是要从效率入手。在323055,41520421这数据,我测了下是14秒,比其他鱼油快点,部分鱼油解答不出来这个数据。估计又要被版主说超时了。已经想好了这一步了。如果有优化空间在发上来。

  1. from bisect import bisect,bisect_left
  2. from math import gcd
  3. from functools import reduce
  4. def get_lcm(lst):
  5.     return reduce(lambda a,b:a*b//gcd(a,b),lst)
  6. def get_test(num):
  7.     for i in str(num):
  8.         if num% int(i):return False
  9.     return True
  10. 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]
  11. right_n=[]
  12. def fun354(left,right):
  13.     if right<1000:
  14.         return  a[bisect_left(a,left):bisect(a,right)]
  15.     elif left<1000 and right>1000:
  16.         b=right//1000
  17.         for i in range(1,b+1):
  18.             if '0' not in str(i):
  19.                 right_lcm=get_lcm(list(map(int,str(i))))
  20.             for j in range(i*1000+111,(i+1)*1000):
  21.                 if '0' not in str(j) and get_test(j):
  22.                     break
  23.             for k in range(j,(i+1)*1000,right_lcm):
  24.                 if '0' not in str(k) and get_test(k) and k<=right:
  25.                     right_n.append(k)
  26.         return a[bisect_left(a,left):]+right_n
  27.     else:
  28.         b=right//1000
  29.         c=left//1000
  30.         for i in range(c,b+1):
  31.             if '0' not in str(i):
  32.                 right_lcm=get_lcm(list(map(int,str(i))))
  33.             for j in range(i*1000+111,(i+1)*1000):
  34.                 if '0' not in str(j) and get_test(j):
  35.                     break
  36.             for k in range(j,(i+1)*1000,right_lcm):
  37.                 if '0' not in str(k) and get_test(k) and k<=right and k>=left:
  38.                     right_n.append(k)
  39.         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 编辑
  1. def f354(x,y):
  2.     z = []
  3.     for i in range(x,y):
  4.         a = i%10    #个位数
  5.         b = i//10   #十位数
  6.         if i<10:
  7.             z.append(i)
  8.         elif a==0:
  9.             pass
  10.         elif i//a == i/a and i//b == i/b:
  11.                 z.append(i)
  12.     return print(z)

  13. f354(1,100)
复制代码

人笨,求指正

评分

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

查看全部评分

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

使用道具 举报

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

  18.     return result

  19. g=test354(323055,41520421)
  20. 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 编辑
  1. def function(left,right):
  2.     list1 = []
  3.     def f(n):
  4.         a = n
  5.         while a >0:
  6.             b = a%10
  7.             if (b == 0) or (n%b !=0):
  8.                 return False
  9.                 #break
  10.             a = a//10
  11.         return True
  12.     for a in range(left,right+1):
  13.         if f(a):
  14.             list1.append(a)
  15.     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 编辑
  1. def q354(left, right):
  2.     DivSelf = []   
  3.     for each in range(left, right+1):
  4.         if '0' not in str(each):
  5.             setDS = set(str(each))            
  6.             count = 1
  7.             for key in setDS:
  8.                count *= int(key)
  9.             if each%count == 0:
  10.                 DivSelf.append(each)
  11.     return DivSelf
复制代码
  1. 我把学习的六楼的‘:=’  借过来用用 哈哈
  2. left = 323055
  3. right = 41520421
  4.         
  5.    
  6. def q354(left, right):
  7.     DivSelf = []   
  8.     for each in range(left, right+1):
  9.         if '0' not in (string := str(each)):                        
  10.             count = 1
  11.             for key in (setDS := set(string)):
  12.                count *= int(key)
  13.             if each%count == 0:
  14.                 DivSelf.append(each)
  15.     return DivSelf
  16.                
  17.                
  18. 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
海象运算符是个好东西,受教啦~~~
  1. 我把学习的六楼的‘:=’  借过来用用 哈哈
  2. left = 323055
  3. right = 41520421
  4.         
  5.    
  6. def q354(left, right):
  7.     DivSelf = []   
  8.     for each in range(left, right+1):
  9.         if '0' not in (string := str(each)):                        
  10.             count = 1
  11.             for key in set(string):
  12.                count *= int(key)
  13.             if each%count == 0:
  14.                 DivSelf.append(each)
  15.     return DivSelf
  16.                
  17.                
  18. print(q354(left, right))
复制代码
你创建了setDS变量,然后就一次也没用过,给你改了改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 23:31:51 | 显示全部楼层
本帖最后由 wuqramy 于 2020-3-18 09:12 编辑
  1. left = input('left = ')
  2. right = input('right = ')
  3. num = [str(x) for x in range(int(left),int(right)+1)]
  4. reault=[]
  5. n=0
  6. for each in num:
  7.     for i in range(len(each)):
  8.         if not int(each[i]) or (int(each) % int(each[i])):
  9.             reault.append(n)
  10.             break
  11.     n+=1
  12. for i in range(len(reault)-1,-1,-1):
  13.     del num[reault[i]]
  14. 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 | 显示全部楼层
  1. left,right = map(int,input().split())
  2. list1 = []
  3. result = []
  4. def zhuan(n):
  5.     if n > 0:
  6.         list1.insert(0,n%10)
  7.         zhuan(n//10)
  8. for i in range(left,right+1):
  9.     zhuan(i)
  10.     for j in list1:
  11.         if j == 0 or i%j != 0:
  12.             break
  13.     else:
  14.         result.append(i)
  15.     list1.clear()
  16. 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 | 显示全部楼层
第一种暴力方法,稍后来个另类的
  1. def fun354(left,right):
  2.     def num2digital(num):
  3.         result = []
  4.         while num:
  5.             result.append(num%10)
  6.             num = num // 10
  7.         result.reverse()
  8.         return result
  9.     def GongBei(iterobj):
  10.         result = 1
  11.         for each in iterobj:
  12.             result = result*each//Gongyue(result,each)
  13.         return result
  14.     def Gongyue(a,b):
  15.         if a<b:
  16.             a,b = b,a
  17.         while b:
  18.             a,b = b,a%b
  19.         return a
  20.     result = []
  21.     for index in range(left,right+1):
  22.         arr = num2digital(index)
  23.         if 0 not in arr:
  24.             if index % GongBei(set(arr))==0:
  25.                 result.append(index)
  26.             else:
  27.                 pass
  28.         else:
  29.             pass
  30.     return result
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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