• 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
    

      

  • 相关阅读:
    最容易懂的红黑树
    Chapter 9 (排序)
    【WC2013】糖果公园
    【Luogu1903】数颜色
    【笔记】Sigmoid函数
    【笔记】费马小定理、数论欧拉定理
    【笔记】单层感知机
    2020ICPC.小米 网络选拔赛第一场
    【Luogu3366】模板:最小生成树
    Codeforces Raif Round 1
  • 原文地址:https://www.cnblogs.com/Yeah-come-on/p/3593720.html
Copyright © 2020-2023  润新知