用1~9使等式成立:ab*c=de*f=ghi

#用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,会在以后贴子介始不重复随机数算法

转载于:https://my.oschina.net/tedzheng/blog/798901

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值