📜  吸血鬼编号

📅  最后修改于: 2021-04-23 18:29:33             🧑  作者: Mango

吸血鬼编号简介及其使用Python的实现。

介绍
在数学中,吸血鬼数(或真正的吸血鬼数)是一个复合自然数v,具有偶数个数字n,可以分解为两个整数x和y,每个整数具有n / 2个数字,而不能同时带有尾随零,其中v精确地包含x和y的所有数字(以任何顺序计数)。 x和y称为the牙。 [来源Wiki]

例子:

  • 1260是一个吸血鬼数,以21和60作为尖齿,因为21×60 = 1260。
  • 126000(可以表示为21×6000或210×600)不是,因为21和6000没有正确的长度,并且210和600都具有尾随零

吸血鬼编号是:
1260、1395、1435、1530、1827、2187、6880、102510、104260、105210、105264、105750、108135、110758、115672、116725、117067、118440、120600、123354、124483、125248、125433、125460、125500, …(OEIS中的序列A014575)

遵循一个模式,有许多无限多个吸血鬼数的已知序列,例如:
1530 = 30×51、150300 = 300×501、15003000 = 3000×5001…

号码为吸血鬼号码的条件:

  1. 有一对数字。叫数字位数:n
  2. 您可以通过将两个整数x和y乘以n / 2个数字来获得数字。 x和y是the牙。
  3. 两个毒牙不能同时以0结尾。
  4. 可以使用x和y中的所有数字以任意顺序进行编号,并且每个数字只能使用一次。

伪码

if digitcount is odd return false
if digitcount is 2 return false
for A = each permutation of length digitcount/2 
        selected from all the digits,
  for B = each permutation of the remaining digits,
    if either A or B starts with a zero, continue
    if both A and B end in a zero, continue
    if A*B == the number, return true
# Python code to check if a number is Vampire
# and printing Vampire numbers upto n using
# it
import itertools as it
  
# function to get the required fangs of the
# vampire number
def getFangs(num_str):
   
    # to get all possible orderings of order that
    # is equal to the number of digits of the 
    # vampire number
    num_iter = it.permutations(num_str, len(num_str))
  
    # creating the possible pairs of number by 
    # brute forcing, then checking the condition 
    # if it satisfies what it takes to be the fangs 
    # of a vampire number
    for num_list in num_iter:
        
        v = ''.join(num_list)
        x, y = v[:int(len(v)/2)], v[int(len(v)/2):]
  
        # if numbers have trailing zeroes then skip
        if x[-1] == '0' and y[-1] == '0':
            continue
  
        # if x * y is equal to the vampire number
        # then return the numbers as its fangs
        if int(x) * int(y) == int(num_str):
            return x,y
    return False
  
# function to check whether the given number is 
# vampire or not
def isVampire(m_int):
  
    # converting the vampire number to string
    n_str = str(m_int)
  
    # if no of digits in the number is odd then 
    # return false
    if len(n_str) % 2 == 1:
        return False
  
    # getting the fangs of the number
    fangs = getFangs(n_str)
    if not fangs:
        return False
    return True
  
# main driver program
n = 16000
for test_num in range(n):
    if isVampire(test_num):
        print ("{}".format(test_num), end = ", ")

输出:

1260, 1395, 1435, 1530, 1827, 2187, 6880, 

有关更多详细信息,请参阅发烧友:

参考:

  1. 罗塞塔码
  2. 维基百科–吸血鬼编号
  3. 堆栈溢出
  4. itertools上的Python文档