鱼C论坛

 找回密码
 立即注册
查看: 3753|回复: 9

求这个算法,怎么速度快

[复制链接]
发表于 2016-12-30 01:38:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
KR$ZZ)7}31H9ID5ROJKZ)J7.png
这道题,用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))

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
小兔兔娃 + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-30 23:23:24 | 显示全部楼层
我也是这么算的,用了好久的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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个未知数,也可以继续化简,减少嵌套层级。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-1 22:07:13 From FishC Mobile | 显示全部楼层
明白了
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-4 08:58:13 | 显示全部楼层

把9个嵌套拆成6个嵌套和3个嵌套来算,速度就很快了。
  1. comb = []
  2. for d in range(10):
  3.         for e in range(10):
  4.                 for f in range(10):
  5.                         for g in range(1,10):
  6.                                 for h in range(10):
  7.                                         for i in range(10):
  8.                                                 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:
  9.                                                         comb.append((d,e,f,g,h,i))
  10. for a in range(10):
  11.         for b in range(10):
  12.                 for c in range(10):
  13.                         for each in comb:
  14.                                 d,e,f,g,h,i = each
  15.                                 if a+b-c==4 and a+d/g==4 and b-e*h==4 and c-f-i==4:
  16.                                         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
[Finished in 0.3s]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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<=,吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-7 07:32:32 | 显示全部楼层
大于等于0可以不加的,因为正整数相乘和相加本来就大于等于0的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-7 09:37:20 | 显示全部楼层
明白了,谢谢层主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 19:37:30 | 显示全部楼层
本帖最后由 熊孩子的爱 于 2017-1-11 19:38 编辑


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 10:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表