987654321的階乘轉12進制末尾幾個0? 的詳細解決辦法..

先給答案: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
相關文章
相關標籤/搜索