Project Euler 47

本文探讨了一个数学问题:找到一系列连续的整数中,每个数都具有至少四个不同质因数的最小整数集合。通过算法优化,实现快速查找过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题是找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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值