Python吸血鬼号码

时间:2016-09-11 02:58:05

标签: python python-3.x numbers

首次在此社区发帖。我最近开始学习Python(2周),并且作为练习同学的方法给了我一个任务:“编写一个程序,检查整数是否是吸血鬼号码。 要使整数成为吸血鬼数(v),它需要满足以下4个标准:

1)有一对数字。让我们调用位数:n

2)你可以通过乘以两个整数x和y来获得v,每个整数有n / 2个数字。 x和y是f牙。

3)两个f牙不能同时结束。

4)v可以使用x和y中的所有数字以任何顺序进行,并且只使用每个数字一次。

示例:

21 * 60 = 1260< - 吸血鬼数

210 * 600 = 126000< - 不是吸血鬼号

第一个吸血鬼数字如下: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,126027,126846,129640,...

到目前为止,我已经制定了一个可以达到前3个标准的程序(我认为)。我正在寻找最后一个的帮助。

这就是我所拥有的:(对不起西班牙文的一些内容)

{{1}}

2 个答案:

答案 0 :(得分:2)

1260是一个吸血鬼号码,因为除数可以连接成1260的排列。你可以这样做

v=int(input("Enter number to test for vampire:"))

from collections import Counter

def is_anagram(a, b):
    if len(a) != len(b):
        return False
    return Counter(a) == Counter(b)

import math
for x in range(0,int(math.pow(10, len(str(v))/2))):
        for y in range(0,int(math.pow(10, len(str(v))/2))):
            if (x*y == v):
                #print('Fangs: %d %d' % (x, y))
                if (is_anagram(str(str(x)+''+str(y)), str(v)) ):
                    print('Vampire')

要列出第一个n吸血鬼号码,您可以将上述代码用作函数并逐步测试整数。

答案 1 :(得分:2)

以下是获取6位数或更长数字的解决方案的快速方法:

import itertools as it

def get_fangs(num_str):
    num_iter = it.permutations(num_str, len(num_str))
    for num_list in num_iter:
        v = ''.join(num_list)
        x, y = v[:int(len(v)/2)], v[int(len(v)/2):]
        if x[-1] == '0' and y[-1] == '0':
            continue
        if int(x) * int(y) == int(num_str):
            return x,y
    return False

def is_vampire(m_int):
    n_str = str(m_int)
    if len(n_str) % 2 == 1:
        return False
    fangs = get_fangs(n_str)
    if not fangs:
        return False
    return True

for test_num in range(150000):
    if is_vampire(test_num):
        print ("{}".format(test_num), end = ", ")

这是我运行时的输出(在IDLE中):

>>> 
================== RESTART: C:\Users\Joe\Desktop\vampire.py 
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, 126027, 126846, 129640, 129775, 
131242, 132430, 133245, 134725, 135828, 135837, 136525, 136948, 139500, 
140350, 143500, 145314, 146137, 146952,  
==================
>>>