Python: 每日一题 63
吸血鬼解释:1994年柯利弗德·皮寇弗在Usenet社群sci.math的文章中首度提出吸血鬼数。后来皮寇弗将吸血鬼数写入他的书Keys to Infinity的第30章。吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
例如:
1260 = 21 * 60
1827 = 21 * 87
那么,找出10000以下的吸血鬼数字吧。 本帖最后由 冬雪雪冬 于 2017-6-10 15:55 编辑
好像两位数没有解
from itertools import permutations as per
for i in range(1000, 10000):
for j in per(str(i), 4):
x = ''.join(j[:2])
y = ''.join(j)
if i == int(x) * int(y):
print('%d = %s * %s'%(i, x, y))
break
1260 = 21 * 60
1395 = 15 * 93
1435 = 41 * 35
1530 = 51 * 30
1827 = 87 * 21
2187 = 27 * 81
6880 = 86 * 80
from itertools import permutations asperms
for x in range(1000,10000):
for a,b,c,d in perms(map(int, str(x))):
y,z = (a*10+b),(c*10+d)
if y * z == x:
print('%d = %d * %d'%(x, y, z))
break
print set()
jerryxjr1220 发表于 2017-6-10 18:45
不错,还可以继续优化~ jerryxjr1220 发表于 2017-6-10 18:45
{x*y:(x,y) for x in range(10,100)
for y in range(10,100)
if x*y>999 and sorted(str(x*100+y))==sorted(str(x*y))}
{1260: (60, 21),
1395: (93, 15),
1435: (41, 35),
1530: (51, 30),
1827: (87, 21),
2187: (81, 27),
6880: (86, 80)} 冬雪雪冬 发表于 2017-6-10 15:52
好像两位数没有解
写的忒好,学到很多,感谢 {:10_266:} 写完看看前面,感觉自己怎么写得这么长··· ···{:10_269:}
另外,真是佩服jerry大神,每次都能找着不一样的思路
碰到偶数位的数字就拆一半,把全排列过一遍
# 可以将排除范围加快,遇到奇数位直接 *10
def find_v_num(n):
result = []
i = 1260
while i <= n:
length = len(str(i))
if length %2:
i*=10
else:
for j in set(itertools.permutations(str(i))):
if int("".join(j[:length//2]))*int("".join(j)) == i:
result.append(i)
break
i += 1
return result import random
import itertools
def vampire(n):
num = set()
for j in range(n):
n1 = list(str(j))
#print(n1)
n2 = len(n1)
#random.random.choices()
if n2 % 2 == 0:
fori in itertools.permutations(n1):
if (i) == 0 and (i == 0):
continue
elif int(i) * int(i) != int(n1):
continue
elif int("".join(i[:n2//2])) * int("".join(i)) == j:
print(j, "=", int("".join(i[:n2//2])), "*", int("".join(i)))
num.add(j)
else:
continue
print(num)
#for i in range(len(n1)):
#for j in range
#n
#num_list = []
vampire(10000) res=['%d=%d*%d' %(x1*x2,x1,x2) for x1 in range(10,100) for x2 in range(x1,100) if sorted(str(x1*x2))==sorted(str(x1)+str(x2))]
print('\n'.join(res)) 冬雪雪冬 发表于 2017-6-10 15:52
好像两位数没有解
我感觉主要是因为吸血鬼数字必须是一对数相乘得到,而且这对数必须各包含乘积一半位数的数字。当结果是两位数时,在10--20之间,这对数字其中一个必须包含1,这就意味着另一个必须是两位数;当结果是20-29时,其中一个必须是2,这也就意味着另一个数字必须是两位数。以此类推,两位数的吸血鬼数字不存在
页:
[1]