这题……终于遇到让我非常困惑的题了……
因为这道题不能让我找到一个效率高的处理方式……
只能说,自己对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多少年了……