• n!末尾有多少个0以及n!末尾第一个非0数字


    (1)n!末尾有多少个0

        第一种思路:

        n!=n*(n-1)*(n-2)*....3*2*1,而如果要出现0,必须得有2和5出现,但是明显n!中5的因子个数少于2的因子个数,即转化为求 n!中因子5的个数

        int count(int n)

        {  

        int sum=0;

               while(n)

               {

          sum+=n/5;

                     n/=5;

               }

               return sum;

         }

         第二种思路:计算n!,每次末尾出现0,则将0消去,计数器并自增1

          int count=0;

          int ans=1;

            for(i=n;i>=2;i--)
            {
                ans*=i;
                while(ans%10==0)        //消除末尾的0
                {

                    ans/=10;

                    count++;
                }
                if(ans>=100000)           //只需保存末尾5位数字即可
                    ans%=100000;

            }

              while(ans%10==0)        //消除末尾的0
              {

                    ans/=10;

                    count++;
              }

             count即为所求

    (2)n!末尾第一个非0数字

        两种思路

        第一种:直接求出n!,然后得出结果

        第二种:按照问题(1)中的第二种思路解决即可。

  • 相关阅读:
    每天一个小算法(Heapsort)
    每天一个小算法(matlab armijo)
    每天一个小算法(Shell sort5)
    每天一个小算法(Shell Sort3)
    每天一个小算法(Shell Sort2)
    Java并发编程:阻塞队列
    Java并发编程:并发容器之CopyOnWriteArrayList
    Java并发编程:并发容器之ConcurrentHashMap
    Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
    豆瓣的前世今生
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2014529.html
Copyright © 2020-2023  润新知