求这个算法,怎么速度快
这道题,用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))
我也是这么算的,用了好久的呀 时间长就是因为循环嵌套层级太多了。如果能少一级,就能减少10倍计算量。一般,6个方程解9个未知数,也只能将其中3个未知数表示其余未知数,以获得解空间。稍微处理一下6个方程,其中3个涉及乘除运算,较复杂;其余3个只有加减,可以先处理。可以发现,如果x6,x7,x8的值确定了,则x3=x6+x7+x8,x9=x7+x8-4,从而可以减少2级嵌套。剩余4个方程解4个未知数,也可以继续化简,减少嵌套层级。 明白了{:10_281:}
谢谢 熊孩子的爱 发表于 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
jerryxjr1220 发表于 2017-1-4 08:58
把9个嵌套拆成6个嵌套和3个嵌套来算,速度就很快了。
输出:
层主,为什么第08行的e*h<=5不是小于等于4呢?为什么是f+i<=5,不是4呢?这里为什么用加号,问题上面是减号的嘛!
可以不加0<=,吗? 小兔兔娃 发表于 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了。 大于等于0可以不加的,因为正整数相乘和相加本来就大于等于0的 明白了,谢谢层主{:5_101:} 本帖最后由 熊孩子的爱 于 2017-1-11 19:38 编辑
http://i.WoTuLa.com/note.png?name=小猫猫&say=我爱鱼C论坛!。
页:
[1]