十进制中 N! 末尾连续零的个数

  1. 首先考虑 800 中有两个连续的零,800=$8*10^2$

    首先考虑 50 中有一个连续的零,50= $5*10^1$

    从上面可以看出,N! = $a*10^k$ , 那么 N! 末尾就有 $k$ 个连续的零

  2. 由质因数分解唯一定理,10 可以分解为小于10的质数乘积,即 10=2*5

    所以我们只要统计出现 2,5的次数,取其中最小的即是末尾连续的零的个数

    统计方法:

    可以看出 2*5 产生一个0, 4*25产生两个零,8*125产生三个零,依次类推

    例如:计算 2015! 中有多少连续的零
    第一步,计算1到2015里多少个5,25,125,625
    1、2015÷5=403 记作A1;
    2、2015÷25=80.6取整得80 记作A2;
    3、2015÷125=16.12取整得16 记作A3;
    4、2015÷625=3.224取整得3 记作A4;
    第二步,计算上述A1到A4中重复的部分
    1、能被5整除的数里包含的能被25整除的数,记作B1
    B1=A1-A2=403-80=323;
    2、能被25整除的数里包含的能被125整除的数,记作B2
    B2=A2-A3=80-16=64;
    3、能被125整除的数里包含的能被625整除的数,记作B3
    B3=A3-A4=16-3=13;
    4、能被625整除的数里没有重复其它情况,直接计入结果,记作B4
    B4=A4;
    第三步,最终结果是
    B11+B22+B33+B44=323+128+39+12=502.........(1)
    另一种方法:
    2015÷5+2015÷25+2015÷125+2015÷625=403+80+16+3=502。。。。。(2)

    (1) (2)式子思路完全不同

    (1)还需要使用容斥原理的知识去掉重复的部分

    (2)式子为什么可以这么计算?

    可以理解为,在计算 5 的个数时候,包含了 5 25, 125, 625

    在计算25的个数时候,包含了 25 125 625

    在计算125的个数时候,包含了125 625

    在计算625的个数时候,包含了625

    最终,5 计算一次,25计算2次,125计算3次,625计算4次

    从上面可以看出来,计算零的个数时候, $51+252+1253+6254$ ,

    正好和上面每次包含的数量是一致的,一次可以得到正确结果

    对(2)的代码实现

    //一种方法int cnt_R_10_1(int n){int ans=0,mult=5;while(mult<=n){ans+=n/mult;mult*=5;}return ans;
    }//另一种方式,乘法的逆向思维
    int cnt_R_10_2(int n){int ans=0;while(n){ans+=n/5;n/=5;}return ans;
    }
    

M进制中 N! 末尾连续零的个数

  1. 有上面的例子我们可以推出

  1. 实现代码
#include "../common.h"
const int MAXN = 100;//素数表
int prime[MAXN]={2};
//保存 alpha
int ind[MAXN]={0};
//保存 alpha·k 的乘积
int cnt[MAXN]={0};//一种方式
int cnt_R_10_1(int n){int ans=0,mult=5;while(mult<=n){ans+=n/mult;mult*=5;}return ans;
}//另一种方式,乘法的逆向思维
int cnt_R_10_2(int n){int ans=0;while(n){ans+=n/5;n/=5;}return ans;
}void init(){int k=1;for(int i=3;i<=MAXN;i+=2){int flag=0;for(int j=2;j*j<=i;j++){if(i%j==0){flag=1; break;}}if(!flag)prime[k++]=i;}
}//求 alpha·k 的乘积
int getcnt(int x, int p){int ans = 0;while(x){ans+=x/p;x/=p;}return ans;
}int cnt_R_M(int n,int M){init();//看 M 可以被哪些质数分解for(int i=0;i<MAXN;i++){if(prime[i]){while(M % prime[i]==0){ind[prime[i]]++;M /= prime[i];}}       }for(int i=0;i<MAXN;i++){if(ind[i]) cnt[i]=getcnt(n,i);}int ans=1e8;for(int i=0;i<MAXN;i++){if(cnt[i]) ans=min(ans,cnt[i]/ind[i]);}return ans;}int main(int argc, char const *argv[])
{//求解十进制下 N! 中末尾连续零// cout<<"1: "<<cnt_R_10_1(2015)<<endl;// cout<<"2: "<<cnt_R_10_2(2015)<<endl;//2015! 在 M 进制下末尾连续零cout<<cnt_R_M(2015,10)<<endl;return 0;
}

转载于:https://www.cnblogs.com/TianyuSu/p/9370237.html

阶乘末尾连续零的个数相关推荐

  1. python计算n阶乘中尾部零的个数_计算n阶乘中尾部零的个数

    写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野 ...

  2. 枚举算法:试统计正整数n的阶层n!=1*2*...*n尾部连续零的个数。

    试统计正整数n的阶层n!=12-*n尾部连续零的个数. 思路: 首先通过常用对数累加和s=lg2+lg3+-+lg n确定n!的位数m=s+1,即a数组元素的个数.设计两重循环,模拟整数竖式乘法实施各 ...

  3. python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...

    展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...

  4. n的阶乘末尾含有“0”的个数

    关于这道题,见过两种问法: 给定参数n(n为正整数),请计算n的阶乘n!末尾所含"0"的个数. (n!%(10^k)) == 0.已知n,求能使上式成立的K的最大值. 问题分析: ...

  5. 计算n阶乘中尾部零的个数

    计算因数5的个数即可 long long NumOfZero(long long n){long long count=0;while(n>0){count+=n/5;n=n/5;}return ...

  6. 【LeetCode 172. 阶乘后的零】

    LeetCode 172. 阶乘后的零 题目描述 解题思路 class Solution {public int trailingZeroes(int n) {//思路//计算阶乘后为零的个数 因为2 ...

  7. 【算法】计算n阶乘中尾部0的个数

    题目 设计一个算法,计算出n阶乘中尾部零的个数样例 11! = 39916800,因此应该返回 2挑战 O(logN)的时间复杂度 题目分析 n阶乘中,尾部出现的零是10和10的倍数相乘的结果,尾部出 ...

  8. C语言给定数字n阶乘的末尾计算零个数(附完整源码)

    给定数字n阶乘的末尾计算零个数 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) #include <math.h> ...

  9. java 阶乘尾部的零,阶乘算法全集,阶乘末尾非零位,阶末尾零的个数

    阶乘相关算法及程序 有关阶乘的算法,不外乎两个方面:一是高精度计算:二是与数论相关. 一. 高精度计算阶乘 这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算. 首先看小于 ...

最新文章

  1. C# 3.0/3.5语法新特性示例汇总[转]
  2. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(三)
  3. Intellij Idea 使用
  4. 【软件设计师】2020-08-05
  5. java provider_Java SPI(Service Provider Interface)
  6. 启动一个Java进程
  7. 循环队列及C语言实现三
  8. Vue cli3使用jQuery控件
  9. mysql 里的1对n虚线_mysql workbench EER图,里面的实线以及虚线的关系
  10. 分享5个国外较好的图片网站
  11. 单片机温度传感器c语言编码,温度传感器代码解析Ⅱ
  12. 批处理打开/关闭休眠
  13. android控制wifi,Android控制wifi开关
  14. SPSS免费安装教程(详细版)
  15. python分析谷歌浏览器的历史记录
  16. 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程
  17. 64位 Eclipse IDE for Java EE Developers 下载地址
  18. 红石外汇|每日分享:0.667是澳元多头在FOMC会议前的最后一道防线
  19. 函数的返回值——数组返回
  20. conda 安装太慢

热门文章

  1. 计算机中复合模板在哪,冷冲模CAD系统中装配模板的设计与复合算法研究-计算机软件专业论文.docx...
  2. linux git添加密钥,centos – 无法在Gitlab上创建项目或添加ssh密钥
  3. eeprom和编程器固件 k2_用编程器免拆夹子刷斐讯K2 K2P解决难搞固件 刷BREED 无损原EEPROM...
  4. php三年经验 多少工资_PHP2年以上经验,在深圳工资能拿多少?
  5. SimpleDateFormat的parse与format的用法区别
  6. CVE-2021-35464: ForgeRock AM远程代码执行漏洞
  7. XSS-Game level 6
  8. 归并算法(分割与合并)
  9. win7充当无线路由器
  10. 部署点评Cat监控项目(转)