2011-12-01 65 views
1

下面的代码不断告诉我一个错误的数字,我不明白为什么,知道这是蛮力,但它应该仍然有效......它返回的数字的确超过了500个因子,确切地说512,帮助将是非常感谢euler挑战12,为什么这个python代码失败?

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

+1

我认为,即使按照您的意图工作,您将会遇到问题。因为你的数字是1到1/2,所以你不会把数字本身作为除数。这可能不会影响你的答案,但我想你想知道。如果我在这里,请告诉我,我不熟悉python。 – Toast

回答

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 
2

我不知道什么欧拉挑战12,但一个明显的问题是(1/2)。如果你尝试在Python提示符下输入,你会得到0.之所以会尝试做整数运算。我建议只是放(0.5),或者你可以做(​​1/2.0)。

+0

这取决于这是Python 2.x还是3.x.请参阅http://www.python.org/dev/peps/pep-0238/和http://docs.python.org/release/3.0.1/whatsnew/3.0.html#integers – sberry

+0

这是一个很好的观点。我还没有过渡,所以只有在第二次之前才会发生。 –

+0

数字**(1/2)在python 3.x中正常工作,我使用 – Daquicker

2

您的除数计数方法是错误的。 12有6个约数,但你的代码只计算2.

问题:

  1. 一些往往有除数比其平方根较大
  2. 范围不包括它的上限,所以你停药太早
+0

只有去平方根的范围肯定是一个问题。也许OP的意思是做'数字*(1.0/2)'而不是'**' – sberry

+1

@ sberry2A我怀疑OP做了一个不同的错误,只有在平方根上修改很小。 (没有明确的更正,不会破坏问题。) –

1

你的代码已经写是搜索,直到数** 0.5,这是错误的,你必须寻找到数/ 2 所以修正答案是象下面这样:

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

另注:自2-14本身不计入像问题的例子,我加一次执行。

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