吸血鬼编号简介及其使用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…
号码为吸血鬼号码的条件:
- 有一对数字。叫数字位数:n
- 您可以通过将两个整数x和y乘以n / 2个数字来获得数字。 x和y是the牙。
- 两个毒牙不能同时以0结尾。
- 可以使用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,
有关更多详细信息,请参阅发烧友:
参考:
- 罗塞塔码
- 维基百科–吸血鬼编号
- 堆栈溢出
- itertools上的Python文档