ooxx7788 发表于 2017-6-10 14:55:42

Python: 每日一题 63

吸血鬼解释:1994年柯利弗德·皮寇弗在Usenet社群sci.math的文章中首度提出吸血鬼数。后来皮寇弗将吸血鬼数写入他的书Keys to Infinity的第30章。

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。

例如:
1260 = 21 * 60
1827 = 21 * 87


那么,找出10000以下的吸血鬼数字吧。

冬雪雪冬 发表于 2017-6-10 15:52:18

本帖最后由 冬雪雪冬 于 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

SixPy 发表于 2017-6-10 17:24:19

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

jerryxjr1220 发表于 2017-6-10 18:45:47

print set()

SixPy 发表于 2017-6-10 20:26:58

jerryxjr1220 发表于 2017-6-10 18:45


不错,还可以继续优化~

SixPy 发表于 2017-6-11 08:07:27

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)}

Teagle 发表于 2017-6-11 22:56:32

冬雪雪冬 发表于 2017-6-10 15:52
好像两位数没有解

写的忒好,学到很多,感谢

stone1 发表于 2017-6-19 19:36:59

{:10_266:}

solomonxian 发表于 2017-7-27 21:21:35

写完看看前面,感觉自己怎么写得这么长··· ···{: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

新手潘包邮 发表于 2018-4-17 23:03:39

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)

grf1973 发表于 2018-4-18 15:02:54

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))

君子好逑 发表于 2022-9-22 10:26:43

冬雪雪冬 发表于 2017-6-10 15:52
好像两位数没有解

我感觉主要是因为吸血鬼数字必须是一对数相乘得到,而且这对数必须各包含乘积一半位数的数字。当结果是两位数时,在10--20之间,这对数字其中一个必须包含1,这就意味着另一个必须是两位数;当结果是20-29时,其中一个必须是2,这也就意味着另一个数字必须是两位数。以此类推,两位数的吸血鬼数字不存在
页: [1]
查看完整版本: Python: 每日一题 63