>>> def test(x=20):
a="1.4"+"9"*x
for i in xrange(3,len(a)):
print "round(%s)=%s,contains %s '9'" %(a[:i],round(float(a[:i])),(len(a[:i])-3))
>>> test()
round(1.4)=1.0,contains 0 '9'
round(1.49)=1.0,contains 1 '9'
round(1.499)=1.0,contains 2 '9'
round(1.4999)=1.0,contains 3 '9'
round(1.49999)=1.0,contains 4 '9'
round(1.499999)=1.0,contains 5 '9'
round(1.4999999)=1.0,contains 6 '9'
round(1.49999999)=1.0,contains 7 '9'
round(1.499999999)=1.0,contains 8 '9'
round(1.4999999999)=1.0,contains 9 '9'
round(1.49999999999)=1.0,contains 10 '9'
round(1.499999999999)=1.0,contains 11 '9'
round(1.4999999999999)=1.0,contains 12 '9'
round(1.49999999999999)=1.0,contains 13 '9'
round(1.499999999999999)=1.0,contains 14 '9'
round(1.4999999999999999)=2.0,contains 15 '9'
round(1.49999999999999999)=2.0,contains 16 '9'
round(1.499999999999999999)=2.0,contains 17 '9'
round(1.4999999999999999999)=2.0,contains 18 '9'
round(1.49999999999999999999)=2.0,contains 19 '9'
>>>
a="1.4"+"9"*x
for i in xrange(3,len(a)):
print "round(%s)=%s,contains %s '9'" %(a[:i],round(float(a[:i])),(len(a[:i])-3))
>>> test()
round(1.4)=1.0,contains 0 '9'
round(1.49)=1.0,contains 1 '9'
round(1.499)=1.0,contains 2 '9'
round(1.4999)=1.0,contains 3 '9'
round(1.49999)=1.0,contains 4 '9'
round(1.499999)=1.0,contains 5 '9'
round(1.4999999)=1.0,contains 6 '9'
round(1.49999999)=1.0,contains 7 '9'
round(1.499999999)=1.0,contains 8 '9'
round(1.4999999999)=1.0,contains 9 '9'
round(1.49999999999)=1.0,contains 10 '9'
round(1.499999999999)=1.0,contains 11 '9'
round(1.4999999999999)=1.0,contains 12 '9'
round(1.49999999999999)=1.0,contains 13 '9'
round(1.499999999999999)=1.0,contains 14 '9'
round(1.4999999999999999)=2.0,contains 15 '9'
round(1.49999999999999999)=2.0,contains 16 '9'
round(1.499999999999999999)=2.0,contains 17 '9'
round(1.4999999999999999999)=2.0,contains 18 '9'
round(1.49999999999999999999)=2.0,contains 19 '9'
>>>
在看到python的round时想到js有三个关于取整的方法Math.round,Math.ceil还有一个没记住,于是做了一些尝试
还是有点意思的吧?
这个是编程之美里的一个题,我用来熟悉一下python的syntx,不考虑什么算法什么的,just get things done
子数组的最大乘积
>>> def do(x):
return reduce(lambda x,y:x*y,x)
>>> def fun2(x):
"""x is a list"""
temp=[]
for i in range(1,len(x)+1):
for j in range(len(x)+1):
if(j<i):
print x[j:i]
temp.append(do(x[j:i]))
return max(temp)
>>> fun2(x)
[0]
[0, 1]
[1]
[0, 1, 2]
[1, 2]
[2]
[0, 1, 2, 3]
[1, 2, 3]
[2, 3]
[3]
6
return reduce(lambda x,y:x*y,x)
>>> def fun2(x):
"""x is a list"""
temp=[]
for i in range(1,len(x)+1):
for j in range(len(x)+1):
if(j<i):
print x[j:i]
temp.append(do(x[j:i]))
return max(temp)
>>> fun2(x)
[0]
[0, 1]
[1]
[0, 1, 2]
[1, 2]
[2]
[0, 1, 2, 3]
[1, 2, 3]
[2, 3]
[3]
6
数组中的子数组之和的最大值
def do(x):
return sum(x);
#改一下这个do函数,继续复用fun2(x)即可
[-10, 2, 3, 1]
>>> fun2(_)
[-10]
[-10, 2]
[2]
[-10, 2, 3]
[2, 3]
[3]
[-10, 2, 3, 1]
[2, 3, 1]
[3, 1]
[1]
6
return sum(x);
#改一下这个do函数,继续复用fun2(x)即可
[-10, 2, 3, 1]
>>> fun2(_)
[-10]
[-10, 2]
[2]
[-10, 2, 3]
[2, 3]
[3]
[-10, 2, 3, 1]
[2, 3, 1]
[3, 1]
[1]
6
求数组中的递增序列,如1,-1,2,-3,4,-5,6,-7,最长的序列是1,2,4,6
def fun4(y):
x=y[:]
temp=[]
if len(x)<1:
return x
else:
for i in xrange(len(x)-1):
if x[i]<x[i+1]:
temp.append(x[i])
else:
x[i+1]=x[i]
if x[len(x)-1]>x[len(x)-2]:
temp.append(x[len(x)-1])
return temp
[-1, -2, 9, 6, 10]
>>> fun4(_)
[-1, 9, 10]
>>>
x=y[:]
temp=[]
if len(x)<1:
return x
else:
for i in xrange(len(x)-1):
if x[i]<x[i+1]:
temp.append(x[i])
else:
x[i+1]=x[i]
if x[len(x)-1]>x[len(x)-2]:
temp.append(x[len(x)-1])
return temp
[-1, -2, 9, 6, 10]
>>> fun4(_)
[-1, 9, 10]
>>>
这题目走了弯路了,一直在想用reduce,结果进死胡同了,如果是考试肯定答不出了,下面是我错误的代码
def do2(x):
global temp
temp=[]
def nested(a,b):
#global temp
print temp
if(a<b):
if temp==[]:
print "temp is []"
temp.append(a)
temp.append(b)
return b
else:
temp.append(a)
return a
if len(x)>1:
reduce(nested,x)
else:
temp=x[:]
return temp
def fun3(x):
result=[]
for i in xrange(len(x)):
print "current list=",x[i:]
result.append(do2(x[i:]))
print "haha=",result
y=result.sort(lambda x,y:cmp(len(x),len(y)))
print "x=",result
return result.pop()
global temp
temp=[]
def nested(a,b):
#global temp
print temp
if(a<b):
if temp==[]:
print "temp is []"
temp.append(a)
temp.append(b)
return b
else:
temp.append(a)
return a
if len(x)>1:
reduce(nested,x)
else:
temp=x[:]
return temp
def fun3(x):
result=[]
for i in xrange(len(x)):
print "current list=",x[i:]
result.append(do2(x[i:]))
print "haha=",result
y=result.sort(lambda x,y:cmp(len(x),len(y)))
print "x=",result
return result.pop()
给一个N!e.g. N!=362800,N!的末尾有2个0.那N=20时,有x个0,求N!的二进制表示中最低位1的位置
>>> def fun5(x):
temp=str(reduce(lambda a,b:a*b,range(1,x+1)))
print temp
for i in xrange(len(temp)-1,-1,-1):
if temp[i]!='0':
return len(temp)-i-1
>>> fun5(20)
2432902008176640000
4
temp=str(reduce(lambda a,b:a*b,range(1,x+1)))
print temp
for i in xrange(len(temp)-1,-1,-1):
if temp[i]!='0':
return len(temp)-i-1
>>> fun5(20)
2432902008176640000
4
>>> def fun6(x):
yy=reduce(lambda a,b:a*b,xrange(x,0,-1))
print "yy=",yy
zz=tobin(yy)
print "zz=",zz
for i in xrange(len(zz)-1,-1,-1):
if zz[i]=="1":
return len(zz)-i-1
>>>
>>> fun6(5)
yy= 120
zz= 1111000
3
>>> def tobin(x):
L=[]
while (x/2)!=0 or (x%2)!=1:
L.append(str(x%2))
x=x/2
else:
L.append(str(x%2))
return "".join(L[::-1])
>>>
yy=reduce(lambda a,b:a*b,xrange(x,0,-1))
print "yy=",yy
zz=tobin(yy)
print "zz=",zz
for i in xrange(len(zz)-1,-1,-1):
if zz[i]=="1":
return len(zz)-i-1
>>>
>>> fun6(5)
yy= 120
zz= 1111000
3
>>> def tobin(x):
L=[]
while (x/2)!=0 or (x%2)!=1:
L.append(str(x%2))
x=x/2
else:
L.append(str(x%2))
return "".join(L[::-1])
>>>
使用递归和非递归的方法计算阶乘
>>> def fun10(x):
if x>1:
return x*fun10(x-1)
else:
return 1
>>> fun10(3)
6
>>>
if x>1:
return x*fun10(x-1)
else:
return 1
>>> fun10(3)
6
>>>
>>> def fun9(x):
return reduce(lambda a,b:a*b,xrange(1,x+1));
>>> fun9(3)
6
return reduce(lambda a,b:a*b,xrange(1,x+1));
>>> fun9(3)
6
给一个十进制的整数N,写下从1开始到N的所有整数,然后娄一下其中1出现的次数,例如N=2,时写下1,2,这里只出现1次
写一个f(N),返回1到N之间出现"1"的次数,比如f(12)-5
满足条件下f(N)=N的最大的N是多少
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
第二小题我没想出来,难道他是递减的函数吗...