fan1993423 发表于 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=
right_n=[]
def fun354(left,right):
    if right<1000:
      returna
    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+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

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

永恒的蓝色梦想 发表于 2020-3-17 17:50:19

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

悄悄告诉你:不用字符串快一倍

fan1993423 发表于 2020-3-17 18:15:24

永恒的蓝色梦想 发表于 2020-3-17 17:50
悄悄告诉你:不用字符串快一倍

用什么,我还可以改,反正版主还没测试

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

人笨,求指正

Grrr 发表于 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)
答一个

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

fan1993423 发表于 2020-3-17 18:15
用什么,我还可以改,反正版主还没测试

看六楼方法二{:10_248:}{:10_327:}

风魔孤行者 发表于 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
终于有做的来的题目了

Herry2020 发表于 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)
      if divisor == 0:
            active = 0
      elif left % divisor != 0:
            active = 0
      i+= 1
    return active

fun354(1,22)

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

sYMMetrY 发表于 2020-3-17 22:31:35

永恒的蓝色梦想 发表于 2020-3-17 14:38
两个版本,加了注释

方法一:方法二:

海象运算符是个好东西,受教啦~~~{:10_256:}

永恒的蓝色梦想 发表于 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变量,然后就一次也没用过,给你改了改{:10_248:}

wuqramy 发表于 2020-3-17 23:31:51

本帖最后由 wuqramy 于 2020-3-18 09:12 编辑

left = input('left = ')
right = input('right = ')
num =
reault=[]
n=0
for each in num:
    for i in range(len(each)):
      if not int(each) or (int(each) % int(each)):
            reault.append(n)
            break
    n+=1
for i in range(len(reault)-1,-1,-1):
    del num]
print (num)

sYMMetrY 发表于 2020-3-18 00:08:11

永恒的蓝色梦想 发表于 2020-3-17 22:42
你创建了setDS变量,然后就一次也没用过,给你改了改

{:10_254:}干得漂亮

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

Frozen83 发表于 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)
好像我的最长

旅途Z 发表于 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):
                  break
                j += 1
            else:
                output.append(num)
    return output


print(self_mod(1, 22))

TJBEST 发表于 2020-3-18 11:23:17

楼主 我昨天有事没写,下午写行吗?先别关闭题目,我有两种方法。一个暴力的,一个麻烦的。您给受累测一下啊。下午四点之前都能发上去。

zltzlt 发表于 2020-3-18 13:01:07

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

收到

TJBEST 发表于 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] 3 4 5 6
查看完整版本: Python:每日一题 354