POJ 1401&&NYOJ 954 N!

分析:

组合数学问题,这两道题是类似的,分别是求N!的末尾有几个0和N!的二进制表示低位最近的1的位置(即末尾二进制0的个数+1)

首先来谈下POJ1401,

1)求0的个数即是求2*5的个数

2)2必然多于5,直接求解5的个数即可

3)核心点:任意一个数都可能包含一定的5因子,比如3是0个,10是1个,100是2个(5*5*4)......,那么为找出这所有的5因子,我们可以利用循环的方式求解,即F(N)=N/5+F(N/5).100!的话sum=100/5+20/5+4/5+0/5=24

同理,二进制表示中0的个数即为2因子的个数,在0个数的基础上+1即可。

POJ 1401

#include <cstdio>  
int n, t;  
int main()  
{  
    scanf("%d", &t);  
    while (t--) {  
        scanf("%d", &n);  
        int sum = 0;  
        while (n != 0) {  
            sum += n / 5;  
            n /= 5;  
        }  
        printf("%d\n", sum);  
    }  
    return 0;  
}  

你可能感兴趣的:(poj,组合数学,nyoj)