zoukankan      html  css  js  c++  java
  • 乞讨N!到底有多少0

    分析:

    对N质因数分解 N=2^x * 3^y * 5^z...。因为10 = 2*5,所以末尾0的个数仅仅和x与z有关,每一对2和5相乘能够得到一个10。于是末尾0的个数=min(x,z)。在实际中x是远远大于z的。所以我们仅仅要求出z的值就可以。
      依据公式
      z = N/5 + N/5^2 + N/5^3+...+N/5^k
      这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5...。


      比方:25事实上是贡献了2个5,可是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个。相同,125在N/5中贡献一个,在N/5^2中贡献一个,在N/5^3中再贡献一个,一共是3个。


    代码:

    	public int getContinueZero(int num){
    		int countOfZero = 0;
    		while(num>0)
    		{
    			countOfZero+=num/5;
    			num/=5;
    		}
    		return countOfZero;
    	}
    

    用相同思路解下一题:

    求N!的二进制中最低位1的位置。实际上就是推断二进制末尾有多少个0,然后位置=0的个数+1。

    推断二进制末尾0的个数能够用右移操作来完毕。而二进制每次右移一位相当于十进制除以2,直到除不够为止。所以归根结底就是要求N!质因数分解2的数量x。上述要求此操作5的相同数量。

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    JavaSE Day11
    JavaSE Day10
    JavaSE Day9
    JavaSE Day8
    JavaSE Day7
    a
    js 操作 字符串
    委托的生明与使用
    T-SQL 的简单查询语句
    asp.net服务控件的生命周期
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4946869.html
Copyright © 2011-2022 走看看