• 【算法拾遗】阶乘


    转载请注明出处:http://blog.csdn.net/ns_code/article/details/28335353

    前言

        主要看两道有关阶乘的题目,从中能够看出一些规律来。

    题目一

        N!末尾0的个数

        找末尾0出现的个数,那我们就要找产生0的乘数,即哪些数相乘会得到10。我们须要对N。进行质因数分解。因为10 = 2*5,因此0的个数至于N!中2和5出现的的对数有关。而能被2整除的数出现的频率比能被5整除的数要多得多。因此我们找出N!中质因数5出现的个数,即为N!末尾0的个数。

        方法一

        最直接的方法。就是计算1-N中每一个数的因式分解中5的个数,然后相加。代码例如以下:

    int FactorialNum0_1(int n)
    {
    	int count = 0;
    	int i;
    	for(i=1;i<=n;i++)
    	{
    		int j = i;
    		while(j%5 == 0)
    		{
    			count++;
    			j /= 5;
    		}
    	}
    	return count;
    }
        这样的方法的时间复杂度为O(n)。

        方法二

        方法一中对不含质因数5的数也进行了推断。时间复杂度较高。

        另外一种方法要用到例如以下结论:

        N。中含有的质因数k的个数为:[N/k]+[N/k^2]+[N/k^3]+...(总会存在一个t,使得k^t>N,便有[N/k^t]=0)

        这个公式的证明并不难,自己尝试去理解下,当中[N/k]等于1。2,3...N中能被k整除的数的个数。

        用该方法写成的代码例如以下;

    int FactorialNum0_2(int n)
    {
    	int count = 0;
    	while(n)
    	{
    		count += n/5;
    		n /= 5;
    	}
    	return count;
    }
        该方法的时间复杂度为O(log5n)(这里是以5为底n的对数)。


    题目二

        N!

    二进制表示中最低位1的位置

        比方3!为6,二进制为1010。那么最低位的1的位置为2,这里最左边的位置从1開始计算。

        方法一

        我们如果最低位的1的位置为第k位。则N!=2^(k-1)+...+2^t+...+2^p+...,这里t,p等意味着后面的第t+1位。第p+1位也为1,且p>t>k。这样非常easy看出来,N!中质因数2的个数为k-1个,也就是说。最低位1的位置即为N!

    中质因数2的个数加1,因此问题又转化为了求N!中质因数2的个数了,相同利用结论:

    N。中含有的质因数k的个数为:[N/k]+[N/k^2]+[N/k^3]+...(总会存在一个t,使得k^t>N,便有[N/k^t]=0)

        这样写出的代码例如以下:

    int Lowest1(int n)
    {
    	int count = 0;
    	while(n)
    	{
    		count += n/2;
    		n /= 2;
    	}
    	return count + 1;
    }
    
        该方法时间复杂度为O(log2n)(这里是以2为底n的对数)。

        方法二

        用例如以下结论:N!

    中含有质因数2的个数。等于N减去N的二进制表示中1的个数。关于怎样求N的二进制表示中1的个数,參考我的这篇博文;http://blog.csdn.net/ns_code/article/details/25425577,最快的方法的操作步骤仅仅与二进制中1的个数相等,因此这样的方法的时间复杂度更好一些。尽管方法一已经非常快了。这样的方法的时间复杂度为O(k),当中k为N。中1的个数。

    这样的方法的代码不再给出。


  • 相关阅读:
    Jmeter逻辑控制器
    python学习笔记——%占位符的使用
    python学习笔记——生成随机数
    python学习笔记——变量的规则
    loadrunner11中HTTP/HTML的HTML-base script的两种script type有什么区别?
    loadrunner11如何实时查看脚本的运行情况?
    loaderunner11回放脚本时如何设置【运行时行为】?
    appium学习笔记之——popupwindow控件元素无法定位
    Chrome、Firefox、IE等浏览器驱动diver程序存放目录
    npm方式安装appium环境所遇到的各种问题
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6773575.html
Copyright © 2020-2023  润新知