先給答案:493827152python
我纔開始想到的解法:數組
#coding:utf8 #問題:987654321的階乘轉換爲12進制,結尾有多少個0? #個人解法:把每一個元素分解到兩個數組中去,而後結對取出來。結對數就是最後0的個數。。 def i3m(num):#是否是3的倍數 return not bool(num%3) def i2m(num):#是否是2的倍數 return not bool(num%2) def cut3(num):#遞歸切數字 a,b=divmod(num,3) if b==0: s3.append(3) return cut3(a) else: return num def cut2(num): a,b=divmod(num,2) if b ==0: s2.append(2) return cut2(a) else: return num n=0 s2=[] s3=[] for i in xrange(2,987654322): if i cut2(cut3(i)) print i, if len(s2)>=2 and len(s3)>=1:#每次處理完一個數就去清理下數組 s2.pop(0) s2.pop(0) s3.pop(0) n+=1 print n
#額,發現有更好的辦法,只去算出出現次數最少的那個質因數個數就行了,12=2*2*3,可是怎麼知道2個2多,仍是3多?app
#想不到證實的辦法。。工具
#發現規律:spa
工具:指針
#coding:utf8 def g(x):#求末尾‘0’ if x.endswith('L'): x=x[:-1] a=list(x) a.reverse() n=0 for i in a: if i=='0': n+=1 else: break return n f=lambda x: x*f(x-1) if x!=0 else 1 #求階乘 def i3m(num):#是否是3的倍數 return not bool(num%3) def i2m(num):#是否是2的倍數 return not bool(num%2) n3=n2=0 t3=t2=0 def cut3(num):#統計3的個數使用了c中指針計數的方法。O(∩_∩)O哈哈~ a,b=divmod(num,3) global n3,t3 if b==0: if t3==0: n3=1 else: n3+=1 t3=1 return cut3(a) else: if t3==0: n3=0 else: t3=0 return n3 def cut2(num):#統計2的個數 a,b=divmod(num,2) global n2,t2 if b ==0: if t2==0: n2=1 else: n2+=1 t2=1 return cut2(a) else: if t2==0: n2=0 else: t2=0 return n2
先搞下10進制的試試。。確定有規律。code
g(str(f(20)))==4,g(str(f(25)))==6,g(str(f(125)))=31,g(str(f(130)))=32,g(str(f(625)))=156 。。。blog
20/5=4, 25/5=5,125/5=25,130/5=25,625/5=125..遞歸
156=625/5+25+5+1it
32=130/5+5+1
6=1+5
規律:m階乘轉換爲10進制後末尾0的個數就是m/5+5**(math.log(m,5)-2)+5**(math.log(m,5)-3)+。。。+5**0
math.log(987654321,12)=8.33...
987654321/12=82304526
工具:求階乘和
def m(i,j): s=0 for k in range(j+1): s+=i**k return s
工具:求連續幾個數最小公倍數:
def smallest_no_interval_number_multi(n): d=int(math.ceil(math.log(n,2))) t=[] for i in range(2,d+1): if is_prime(i): t.append(i) m=dict.fromkeys(iter(t),1) for i in t: m[i]=int(math.log(n,i)) for i in range(d+1,n+1): if is_prime(i): m[i]=1 s=1 for i in m: s*=i**m[i] return s