/***************************问题描述************************** 1. 给定一个整数N,那么N的阶乘N!末尾有多少个0? 2. 求N!的二进制表示中最低位1的位置 *************************************************************/ /************************问题1思路**************************** N!=K*power(10,M),K不能被10整除,则N!末尾有M个0。对N!进行质因数 分解,有N!=power(2,X)*power(3,Y)*power(5,Z)*...,由于10=2×5, 因此N!有多少个0显然只与X,Z有关,易得M=min(X,Z),因为2出现的频率 大于等于5,所以M=Z,即问题化简为求N!中5的个数 *************************************************************/ /***********************解法1:直接暴力********************** 遍历i=1,2,...,N中每个因子包含5的个数,然后相加 ************************************************************/ int findNumof5v1(int N){ int count=0; for(int i=1;i<=N;i++){ int j=i; while(j%5==0){ count++; j/=5; } } return count; } /**********************解法2:***************************** Z=小于N的数中是5的倍数的个数+25的倍数的个数+125的倍数的个数... 即Z=[N/5]+[N/(5*5)]+[N/(5*5*5)]+... ***********************************************************/ int findNumof5v2(int N){ int count=0; while(N){ count += N/5 ; N /=5 ; } return count; } /*************************问题2思路*************************** 跟问题1类似,可以先求出N!中2的个数(因为每存在一个2,则在数的 最低位多1个0)。因此求1的最低位的位置即为N!中2的个数+1; *************************************************************/ int lowestOnePos(int N){ int count=0; while(N){ count += N/2 ; N /= 2; } return count + 1 ; }