euler挑战12,为什么这个python代码失败了?

时间:2011-12-01 21:02:40

标签: python

以下代码一直告诉我一个错误的数字,我不明白为什么,知道它是蛮力但它应该仍然有效...它返回的数字确实超过500个除数,确切地说512,帮助会非常感谢

Number = 1
Count = 2
Found = False
while Found == False:
    Divisors = 0
    if (Number % 2) != 0:
        for i in range(1, int(Number**(1/2)), 2):
            if Number % i == 0:
                Divisors += 1

    else:
        for i in range(1, int(Number**(1/2))):
            if Number % i == 0:
                Divisors += 1

    if Divisors >= 500:
        print (Number)
        Found = True

    else:
        Number += Count
        Count += 1

供参考:Problem 12 from the Euler Challange

4 个答案:

答案 0 :(得分:3)

整数的因子分解中,每个纯幂的整数除数是(1 +指数)的乘积。

作为一个例子:28 = 2 ^ 2 * 7

幂为2和1,因此除数的数量为(2+1)*(1+1) = 3*2 = 6。轻松一个

更大的一个:2047 * 2048/2 = 2 ^ 10 * 23 * 89

权力为10,1和1,因此除数的数量为11*2*2 = 44

更容易:100 = 2 ^ 2 * 5 ^ 2

权力为2,2,因此有3*3=9个除数。这同样适用于36=2^2*3^2。唯一有趣的部分是指数。

因此,使用任何素因子分解(使用筛子,您不需要素性测试)它会比尝试每个可能的数字更快更可靠。

def factorize(i):
    # returns an array of prime factors
    whatever

def number_of_divisors(i):
    n = 1
    for v in Counter(factorize(i)).values():
        n *= v + 1
    return n

答案 1 :(得分:2)

我不确定Euler Challenge 12是什么,但一个明显的问题是(1/2)。如果你尝试在Python提示符下键入它,你会得到0.原因是它会尝试进行整数数学运算。我建议只放(0.5),或者你可以做(​​1 / 2.0)。

答案 2 :(得分:2)

你的除数计数方法错了。 12有6个除数,但你的代码只有2个。

问题:

  1. 一个数字通常具有大于其平方根的除数
  2. 范围不包括其上限,因此您过早停止

答案 3 :(得分:1)

您编写的代码正在搜索数字** 0.5并且您必须搜索直到数字/ 2 所以更正后的答案如下:

注意:我添加了一些额外的代码来显示进度。并且它们不会影响解决方案。

另一个注意事项:因为Nubmer本身不像问题示例那样计算,所以我添加一次来执行此操作。

Number = 1
Count = 2
Found = False
big_Devisor = 0
print "Number   Count   Divisors" 
while Found == False:
    Divisors = 1  # because the Number is itself Devisor
    if (Number % 2) != 0:
        for i in range(1, int(Number/2), 2):
            if Number % i == 0:
                Divisors += 1
    else:
        for i in range(1, int(Number/2)):
            if Number % i == 0:
                Divisors += 1

    if Divisors >= 500:
        print (Number)
        Found = True

    else:
        if Divisors > big_Devisor:
            big_Devisor = Divisors
            print Number,'\t', Count, '\t', Divisors 
        Number += Count
        Count += 1