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