nefu118-计算N!末尾0的个数

准备知识:

1.(算术基本定理)任何大于1的正整数n都可以表示成素数之积,即素数是整数的乘法构成单位。每个大于1的正整数n都可以被唯一地写成素数的乘积,在乘积中的素因子按照非降序排列。正整数n的分界式

                                                    n=(p1^a1)*(p2^a2)*......*(pk^ak)

称为n的标准分解式,其中p1,p2,......,pk是素数,p1<p2<......<pk,且a1,a2,......,ak是正整数。

2.n!的素因子分解中的素数p的幂为

   [n / p]+[m / p^2]+[n / p^3]+...

题目:

Description

从输入中读取一个数n,求出n!中末尾0的个数。

Input

输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。

Output

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

Sample Input

3
3
100
1024

Sample Output

0
24
253

分析:

题目意思很简单,就是要求阶乘中0的个数,那么根据n!的素因子分解中素数幂的求法,我们可以只关注2和5的幂是多少,因为素数中只有2和5能够凑成素数末尾中的0,所以我们只需求出2,5的幂,然后取出小值就是结果。

代码:


#include <iostream>

using namespace std;

#define ll long long

int main()
{
    int m;
    cin>>m;
    while(m--)
    {
        ll n;
        cin>>n;
        ll t=n,sum1=0,sum2=0;
        ll pf=5,pt=2;
        while(pf<t)
        {
            sum1+=t/pf;
            pf*=5;
        }
        t=n;
        while(pt<t)
        {
            sum2+=t/pt;
            pt*=2;
        }
        cout<<min(sum1,sum2)<<endl;
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整合了这篇文章,补全了所有的基本操作(该文只给出了其12种,这里提供完整的19种功能)http://www.cnblogs.com/lifuqing/archive/2011/08/20/List.html 快速排序部分参考了 http://blog.csdn.net/pinkrobin/article/details/5456094 1.初始化线性表,即置单链表的表头指针为空 2.创建线性表,此函输入终止读取据 3.打印链表,链表的遍历 4.清除线性表L的所有元素,即释放单链表L所有的结点,使之成为一个空表 5.返回单链表的长度 6.检查单链表是否为空,若为空则返回1,否则返回0 7.返回单链表第pos个结点的元素,若pos超出范围,则停止程序运行 8.从单链表查找具有给定值x的第一个元素,若查找成功则返回该结点data域的存储地址,否则返回NULL 9.把单链表第pos个结点的值修改为x的值,若修改成功返回1,否则返回0 10.向单链表的表头插入一个元素 11.向单链表的末尾添加一个元素 12.向单链表第pos个结点位置插入元素为x的结点,若插入成功返回1,否则返回0 13.向有序单链表插入元素x结点,使得插入后仍然有序 14.从单链表删除表头结点,并把该结点的值返回,若删除失败则停止程序运行 15.从单链表删除表尾结点并返回它的值,若删除失败则停止程序运行 16.从单链表删除第pos个结点并返回它的值,若删除失败则停止程序运行 17.从单链表删除值为x的第一个结点,若删除成功则返回1,否则返回0 18.交换2个元素的位置 19.将线性表进行快速排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值