987654321的阶乘转12进制末尾几个0? 的详细解决办法..

先给答案:493827152

我才开始想到的解法:

  

#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多?

#想不到证明的办法。。

#发现规律:

工具:

#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进制的试试。。肯定有规律。

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 。。。

20/5=4, 25/5=5,125/5=25,130/5=25,625/5=125..

156=625/5+25+5+1

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

  

 

 

posted @ 2014-03-11 13:23  Come~on!  阅读(476)  评论(0编辑  收藏  举报