以下代码一直告诉我一个错误的数字,我不明白为什么,知道它是蛮力但它应该仍然有效...它返回的数字确实超过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
答案 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个。
问题:
答案 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