Python-三角形和自恋数函数

Python-三角形和自恋数函数,python,logic,Python,Logic,代码需要返回数字是否为三角形以及是否为自恋者的函数。 主要功能: def main(): playing = True while playing == True: num_input = input('Give me a number from 1 to 10000. Type -1 to exit. ') try: num = int(num_input) if (num == -1): playing = F

代码需要返回数字是否为三角形以及是否为自恋者的函数。 主要功能:

def main():

playing = True
while playing == True:

    num_input = input('Give me a number from 1 to 10000.  Type -1 to exit. ')

    try:
        num = int(num_input)

        if (num == -1):
            playing = False
            continue

        if (num <= 0 or num > 10000):
            continue

        factors = getFactors(num)
        print("The factors of", num, "are", factors)

 if isTriangular(num):
            print(str(num) + ' is triangular')
 if isNarcissistic(num):
            print(str(num) + ' is narcissistic')

三角形数N是一个整数,其中有另一个整数x,其中x(x+1)/2=N

所以你需要把这个关系颠倒过来,从N中求出x的值,然后检查x是否是一个整数

使用二次根函数
(-b+√(b^2-4ac))/2a
在关系
x^2/2+x/2-N=0的规范版本上,
我们得到
x=(√(8N+1)-1)/2

因此,您可以通过从N计算x并检查它是否为整数来实现isTriangular:

def isTriangular(N): 
    x = ((8*N+1)**0.5-1)/2
    return int(x) == x
或者,您可以逐个检查x的值,直到达到或超过N。这是一个指数级的过程,因此不需要花费太多时间(并且您不必担心平方根的舍入问题)

def isTriangular(N): 
    x = ((8*N+1)**0.5-1)/2
    return int(x) == x
def isTriangular(N):
    x = n = 1
    while n < N:
        x += 1
        n  = x*(x+1)//2
    return n == N
def isNarcissist(N):
    digits = [int(c) for c in str(N)]
    return N == sum(d**len(digits) for d in digits)