#用1~9使等式成立:ab*c=de*f=ghi
import os
import random
import time
f1="formula_1.txt" #存储文件
f2="formula_2.txt" #存储文件
#方法1:用循环的方式,不停测试值,直到循环结束
def formula_1(Count):
start=time.clock()
i=0
flag=True
dic={}
try:
for ab in range(10,100):
for c in range(1,10):
for de in range(10,100):
for f in range(1,10):
for ghi in range(999,99,-1):
i=i+1 #记录步序
# if i > Count: raise Exception() #出口,用以测试效率
if ab*c==ghi and de*f==ghi:
if checked(ab,c,de,f,ghi)==0:
line=str(ab)+"x"+str(c)+"="+str(de)+"x"+str(f)+"="+str(ghi)
if not dic.has_key(line): #用字典去重
dic[line]=1
Write_File(f1,line) #写入文件
print line
except:
pass
end = time.clock()
Write_File(f1, "spend "+str(end-start))
Write_File(f1,"step "+str(i))
def checked(ab,c,de,f,ghi): #比较是否是1~9唯一值
num1=set([1,2,3,4,5,6,7,8,9]) #建立set
a=int(str(ab)[0]) #分割多位数
b=int(str(ab)[1])
c=int(str(c))
d=int(str(de)[0])
e=int(str(de)[1])
f=int(str(f))
g=int(str(ghi)[0])
h = int(str(ghi)[1])
i = int(str(ghi)[2])
num2=set([a,b,c,d,e,f,g,h,i])
if num1==num2: #set比较
return 0 #返回值,0为True
else:
return 1 #返回值,1为False
#方法2:用产生随机数的方式,尽可能多的测试样本可能性
def formula_2(Count):
start = time.clock()
i=0
flag=True
dic={}
while flag:
i=i+1 #记录步序
if i > Count:
flag = False #出口
else:
list=random.sample(range(1,10),9) #获取9个1~9之间不重复随机数
ab = list[0]*10+list[1]
c=list[2]
de=list[3]*10+list[4]
f=list[5]
ghi=list[6]*100+list[7]*10+list[8]
if ab * c == ghi and de * f == ghi:
line = str(ab) + "x" + str(c) + "=" + str(de) + "x" + str(f) + "=" + str(ghi)
if not dic.has_key(line):
dic[line] = 1
Write_File(f2,line) # 写入文件
print line
end = time.clock()
Write_File(f2, "spend "+str(end-start))
Write_File(f2,"step "+str(i))
def Write_File(ff,str): #写入文件
f=open(ff,'a')
f.write(str)
f.write("\n")
f.close()
#运行
if os.path.exists(f1):os.remove(f1) #初始化文件
if os.path.exists(f2):os.remove(f2) #初始化文件
formula_1(1000000)
formula_2(1000000)
print "Done"
大概测式结果如下:
方法1结果:
29x6=58x3=174 39x4=78x2=156 58x3=29x6=174 78x2=39x4=156 spend 52.7837701472 step 590490000
方法2结果:
29x6=58x3=174 39x4=78x2=156 58x3=29x6=174 78x2=39x4=156 spend 6.96577661732 step 1000001
结论:
a.在步数为1000000的时候,方法1没有找到;方法2几种情况都找到了
b.方法2的效率要高于方法1;但从可靠性上来说方法1更好因为方法1总是将所有情况都循环一次
PS:不重复随机数的抽取用的是python自身的random,会在以后贴子介始不重复随机数算法