熊孩子的爱 发表于 2016-12-30 01:38:43

求这个算法,怎么速度快


这道题,用python3.0写的,下面是代码(速度感人)
z=list(range(0,10))
y=list(range(1,10))
x1=x2=x3=x4=x5=x6=x7=x8=x9=0#(百分比)
for a in z:
    x1+=1
    for b in z:
      x2+=1
      for c in z:
            x3+=1
            for d in z:
                x4+=1
                for e in z:
                  x5+=1
                  for f in z:
                        x6+=1
                        for g in y: #除数不能为0
                            x7+=1
                            for h in z:
                              x8+=1
                              for i in z:
                                    x9+=1
                                    if a+b+c==4 and d-e*f==4 and g+h-i==4 and a+d/g==4 and b-e*h==4 and c-f-i==4:
                                        print (a,b,c,d,e,f,g,h,i)
                                    w=int(str(a)+str(b)+str(c)+str(d)+str(e)+str(f)+str(g)+str(h)+str(i))/(10**9*9)
                                    print ('%.7f%%' % (w*100))

吴三石 发表于 2016-12-30 23:23:24

我也是这么算的,用了好久的呀

xiaofu58566 发表于 2016-12-31 10:03:06

时间长就是因为循环嵌套层级太多了。如果能少一级,就能减少10倍计算量。一般,6个方程解9个未知数,也只能将其中3个未知数表示其余未知数,以获得解空间。稍微处理一下6个方程,其中3个涉及乘除运算,较复杂;其余3个只有加减,可以先处理。可以发现,如果x6,x7,x8的值确定了,则x3=x6+x7+x8,x9=x7+x8-4,从而可以减少2级嵌套。剩余4个方程解4个未知数,也可以继续化简,减少嵌套层级。

熊孩子的爱 发表于 2017-1-1 22:07:13

明白了{:10_281:}
谢谢

jerryxjr1220 发表于 2017-1-4 08:58:13

熊孩子的爱 发表于 2017-1-1 22:07
明白了
谢谢

把9个嵌套拆成6个嵌套和3个嵌套来算,速度就很快了。
comb = []
for d in range(10):
        for e in range(10):
                for f in range(10):
                        for g in range(1,10):
                                for h in range(10):
                                        for i in range(10):
                                                if d-e*f==4 and g+h-i==4 and 0<=d/g<=4 and 0<=e*h<=5 and 0<=f+i<=5:
                                                        comb.append((d,e,f,g,h,i))
for a in range(10):
        for b in range(10):
                for c in range(10):
                        for each in comb:
                                d,e,f,g,h,i = each
                                if a+b-c==4 and a+d/g==4 and b-e*h==4 and c-f-i==4:
                                        print(a,b,c,d,e,f,g,h,i)
输出:
1 8 5 6 2 1 2 2 0
2 6 4 4 1 0 2 2 0
2 7 5 4 1 0 2 3 1
2 8 6 4 1 0 2 4 2
2 8 6 6 2 1 3 2 1
2 8 6 8 4 1 4 1 1
2 9 7 4 1 0 2 5 3
3 6 5 4 2 0 4 1 1

小兔兔娃 发表于 2017-1-7 01:00:05

jerryxjr1220 发表于 2017-1-4 08:58
把9个嵌套拆成6个嵌套和3个嵌套来算,速度就很快了。

输出:


层主,为什么第08行的e*h<=5不是小于等于4呢?为什么是f+i<=5,不是4呢?这里为什么用加号,问题上面是减号的嘛!
可以不加0<=,吗?

jerryxjr1220 发表于 2017-1-7 07:30:18

小兔兔娃 发表于 2017-1-7 01:00
层主,为什么第08行的e*h

因为我是把等式拆开的,原本的等式b-e*h=4,如果b最大可以取到9,那么e*h最大只能取到5。同理c-f-i=c-(f+i)=4,如果c最大取到9,那么f+i最大只能是5了。

jerryxjr1220 发表于 2017-1-7 07:32:32

大于等于0可以不加的,因为正整数相乘和相加本来就大于等于0的

小兔兔娃 发表于 2017-1-7 09:37:20

明白了,谢谢层主{:5_101:}

熊孩子的爱 发表于 2017-1-11 19:37:30

本帖最后由 熊孩子的爱 于 2017-1-11 19:38 编辑

http://i.WoTuLa.com/note.png?name=小猫猫&say=我爱鱼C论坛!。
页: [1]
查看完整版本: 求这个算法,怎么速度快