可能超时了,指AC成功10%,优化怎么减少循环~
import sys
if __name__=="__main__":
num=int(raw_input())
res=0
while(num>0):
tmp=str(num)
for k in xrange(len(tmp)):
if(tmp[k]!="4" ) and (tmp[k]!="7"):
break
if(tmp[k]=="4") or (tmp[k]=="7"):
if(k==len(tmp)-1):
res=res+1
num=num-1
if(res>=(10*10*10*10*10*10*10*10*10)):
res=res/(10*10*10*10*10*10*10*10*10+7)
print res
优化解题思路:
根据输入数num,把它转换成字符串,算其长度;
如输入9,其长度为1,f(1)=2 幸运数有:4、7
如输入99,其长度2,f(2)=2^2+f(1) 幸运数有:4、7、44、47、74、77
如输入999,其长度为3,f(3)=2^3+f(2) 幸运数有:4、7、44、47、74、77 444 447 474 477 777 744 747 774
len(num)
f(len(num)-1)=2^(len(num)-1)+f(len(num)-2)递归方法
例子1:如找65534的幸运数,65534>9999,而9999的幸运数有f(4)=2^4+f(3)个,
65534最大位为6在4与7之间,故最大位的幸运数只能填4,后面空格可以填4、或7,故有1*2*2*2*2=16
65534的幸运数个数为16+2^4+f(3)=16+16+14=46个
例子2:如找35534的幸运数,最大位值3小于4,故五位数的幸运数没有,35534的幸运数个数为0+2^4+f(3)=16+14=30个
例子3:如找85534的幸运数,最大位为8大于7,故最大位的幸运数能填4或7,后面四位数可以填4、或7,故有2*2*2*2*2=32
85534的幸运数个数为32+2^4+f(3)=32+16+14=62个
例子4:如果最大位等于4或7,则因比较其次大位的值与4、7大小,同上最大位与4、7的情况;如48534,1*2*2*2*2=16 五位数的幸运数第一个空格只能填4、由于次位数为8大于7,次位数可填4、7后面均是如此,故有16个五位数的幸运数;
48534的所有幸运数有:16+2^4+f(3)=16+16+14=46个
44434的所有幸运数有:1*1*1*0*1+2^4+f(3)=0+16+14=30个
77434的所有幸运数有:1*2*2*2*2+1*1*2*2*2+2^4+f(3)=16+8+16+14=54个
77434构五位数幸运数时,最大位为4,后面可为4、7故有1*2*2*2*2=16种
最大位为7,后面位为4,故有1*1*2*2*2=8
最大位为7,后面位为7,判断第三位值为4,第四位为3小于4,故1*1*1*0* 1=0种