N!末尾有都少个0,首先追本溯源0是怎么得来的,所有的0都是由质因数2和5相乘得到的。
那么对所有的N!在内的N个数进行质因数分解,只需要计算2和5的个数,取其中较小的一个,即能得到N!有多少个0。
(1)要对N个数进行质因数分解,采取最暴力的方式也能解决,当N很大的情况下就不再适用了,那么有没有一种方法能够快速求出这N个数中有多少个2或5呢?
(2)采用缩小范围的方法,举例来说要求N!由多少个m(m是质数),那么首先用N/m=s。那么这s个数(1--s)*m都能被m整除。同时还有一些数能多次整除m
就将这些数转到(1--s)范围内,转化成求(1--s)有多少个数能被m整除了。
代码实现:
/*
* File: main.cpp
* Author: sxw
*
* Created on 2012年8月27日, 下午6:02
*/
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
/*
* 求N!末尾有多少个0
*/
int fun(int n,int m)
{
int ans=0;
while(n)
{
n/=m;
ans+=n;
}
return ans;
}
int main(int argc, char** argv) {
int n,ncases;
cin>>ncases;
while(ncases--)
{
cin>>n;
cout<<min(fun(n,2),fun(n,5))<<endl;
}
return 0;
}注:可以到 http://poj.org/problem?id=1401 测试你写的代码。