Project Euler 51

本文通过迭代加深搜索的方法,尝试找出具有最多同族素数的最大数值。作者利用Python实现了一个算法,该算法会枚举替换的位数并检查替换后的数字是否为素数。文章详细记录了从构思到实现过程中的挑战。

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

这题……终于遇到让我非常困惑的题了……


因为这道题不能让我找到一个效率高的处理方式……


只能说,自己对python,或者对C还是不够熟练……


简单地说,我用的还是迭代加深搜索,枚举替换的位数(*的个数),搜索出所有可能的位置组合。

然后用0~9换进去,检查是否是prime

听上去挺简单,写起来却挺麻烦……


import sys
import datetime

def euler(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
			if i>100000:
				pl.append(i)
			j=i*i
			t+=1
			while j<n:
				a[j]=0
				j+=i
	return pl


def count_prime_num(prime_num, pos_list):

	prime_str = str(prime_num)
	length = len(pos_list)
	if (length == 2 and not (prime_str[pos_list[0]] == prime_str[pos_list[1]])) \
	or (length == 3 and not (prime_str[pos_list[0]] == prime_str[pos_list[1]] == prime_str[pos_list[2]])):
		return 0
	
	prime_list = list(prime_str)
	count = 0
	for i in range(10):
		for j in pos_list:
			prime_list[j] = str(i)
		if int("".join(prime_list)) in prime:
			count += 1
	if count == 8:
		print(prime_num, count)
		print(datetime.datetime.now() - t0)
		sys.exit()


def deepsearch(prime_num, length, pos_list, position):
	if length == 0:
		count_prime_num(prime_num, pos_list)
		return 0

	if position<5:
		position = position + 1
		deepsearch(prime_num, length, pos_list[:], position)
		position = position - 1
	
	if position<=5:
		pos_list.append(position)
		position = position + 1
		deepsearch(prime_num, length-1, pos_list[:], position)
		pos_list.pop()
		position = position - 1
	return 0

t0 = datetime.datetime.now()
prime = euler(1000000)
for j in prime:
	for i in [2, 3]:
		deepsearch(j, i, [], 0)

期间遇到了各种各样奇怪的问题……同时,为了使用prime这个全局变量,我也放弃了那个标准写法……没有main()。

想想刚才debug过程中,开着Sublime Text 2来修改,开着IDLE来execute,开着Pycharm来debug(F8&F7)……真是有点苦逼的……


屏幕的确有点小了……嗯……


好吧……其实下面的那个语句

	for i in [2, 3]:
如果你能猜到,这个替换的*个数是3,那么省略这段吧……

因为加上这段,我的程序1分钟才跑出结果……不加能勉强14s……


总之就是很慢了……哎……伤感啊……要是OJ……早就TLE多少年了……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值