Python吸血鬼麻木

2024-10-02 16:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

第一次在这个社区发帖。我最近开始学习Python(2周),一位同学给了我一个任务:“编写一个程序来检查整数是否是吸血鬼数字。 要使整数成为吸血鬼数(v),它需要满足以下4个条件:

1)有一对数字。我们打电话给数字:n在

2)你可以用两个整数x和y相乘得到v,每个整数都有n/2位数。x和y是尖牙。在

3)两个尖牙不能同时以0结尾。在

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个标准(我想)。我在找最后一个的帮助。在

这就是我得到的:(抱歉用西班牙语写的东西)

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

Tags: forreturnifdef数字整数elseint
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 = ", ")

下面是我在空闲状态下运行时的输出:

^{pr2}$

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吸血鬼数字,可以将上面的代码用作函数并增量测试整数。在

相关问题 更多 >