第一次在这个社区发布。我最近开始学习Python(2周),作为一个练习一个同学的方法给了我一个任务:“编写一个程序,检查一个整数是否是吸血鬼数字。
要使整数成为吸血鬼数(v),它需要满足以下4个条件:
1)有一对数字。让我们调用位数:n
2)通过将两个整数x和y相乘,得到v,每个整数的n/2位数。X和Y是尖牙。
3)两个牙不能同时终止于0。
4)V可以由X和Y的所有数字按任意顺序生成,并且每个数字只能使用一次。
例子:
21*60=1260210*600=126000第一个吸血鬼号码是:1260,1395,1435,1530,1827,2187,6880,102510,104260,105210,105264,105750,108135,110758,115672,11675,117067,118440,120600,123354,124483,125248,125433,125460,125500,126027,126846,129640,…
到目前为止,我已经做了一个程序,可以达到前三个标准(我想)。我在找最后一个的帮助。
这就是我得到的:(抱歉,有些东西是西班牙语)

v=int(input("Enter number to test for vampire:"))
#Test for pair number of digits
def nd(a):
    nd = 0
    while a != 0:
        d = a % 10
        if d != 0:
            nd += 1
        a = a // 10
    return nd
def DigitosPar(a):
    if nd(a)%2==0:
        return 1
    else:
        return 0
#Last digit is 0
def UltimoDigCero(b):
    ud = 0
    ud = b % 10
    if ud==0:
        return 1
    else:
        return 0

if DigitosPar(v)==1:
    x=[]
    for i in range(int(10**(nd(v)/2-1)),int(10**(int(nd(v))/2))):
        x.append(i)
    y=x
    z=0
    posiblex=0
    posibley=0
    for ia in range(0,len(y)):
        for ib in range(0,len(x)):
            z=y[ia]*x[ib]
            if z==v and not((UltimoDigCero(x[ib])==1 and UltimoDigCero(y[ia])==1)):
                posiblex=x[ib]
                posibley=y[ia]
                print(v,"has as fangs",posiblex,posibley)
    if posiblex==0:
        print(v, "not a vampire")
else:
    print(v, "not a vampire")

最佳答案

这里有一种快速的方法可以得到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 = ", ")

这是我在空闲时的输出:
>>>
================== 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,
==================
>>>

08-16 03:38