您的位置:首页 > 编程语言 > Python开发

Project Euler 47

2012-11-28 20:43 197 查看
这道题是找n个连续的有n个不同质因数的最小的数……

直接暴力枚举~

def sss(n):
a = [1 for i in range(n)]
a[0], a[1], a[2] = 0, 0, 1
pl = []
t = s = 0
for i in range(2,n):
if a[i]:
s+=i
pl.append(i)
j=i*i
t+=1
while j<n:
a[j]=0
j+=i
return pl

def check(x, prime):
count = 0
for i in prime:
if x%i == 0:
count += 1
while x%i == 0:
x //= i
if x <= 1:
return count
return count

def main():
prime = sss(15000)
factors = [0]
for i in range(1, 150000):
factors.append(check(i, prime))
for i in range(1,149995):
if (factors[i] == 4) and (factors[i+1] == 4) and (factors[i+2] == 4) and (factors[i+3] == 4):
print(i)

if __name__ == '__main__':
main()


不过这里面我想到一个方法,就是用一个数组,存取到i位置为止,总共多少个满足factors == 4

这样只要判断 f[i] - f[i-3] == 4 比上面的判断简单多了~不过这是小细节了~

不过上面的代码不一定正确……因为我想优化来着……不知道有没有改乱了……

另外一个代码是看网上人写的~似乎是优化……他写的自己用了2秒多点……

实测挺慢的~差不多速度……

import math

def check(x):
count = 0
res = []
if x%2 == 0:
res.append(2)
while x%2 ==0:
x //= 2
limit = math.sqrt(x+1)
i = 3
while i <= limit:
if x % i == 0:
res.append(i)
x //= i
limit = math.sqrt(x+i)
else:
i += 2
if x != 1:
res.append(x)
return len(set(res))

def main():
factors = [0]
for i in range(1, 150000):
factors.append(check(i))
for i in range(1,149995):
if (factors[i] == 4) and (factors[i+1] == 4) and (factors[i+2] == 4) and (factors[i+3] == 4):
print(i)

if __name__ == '__main__':
main()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Project Euler Python