zoukankan      html  css  js  c++  java
  • 阶乘

    转载请注明出处: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的个数。这样的方法的代码不再给出。


  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3798641.html
Copyright © 2011-2022 走看看