阶乘末尾连续零的个数
十进制中 N! 末尾连续零的个数
首先考虑 800 中有两个连续的零,800=$8*10^2$
首先考虑 50 中有一个连续的零,50= $5*10^1$
从上面可以看出,N! = $a*10^k$ , 那么 N! 末尾就有 $k$ 个连续的零
由质因数分解唯一定理,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! 末尾连续零的个数
- 有上面的例子我们可以推出
- 实现代码
#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
阶乘末尾连续零的个数相关推荐
- python计算n阶乘中尾部零的个数_计算n阶乘中尾部零的个数
写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野 ...
- 枚举算法:试统计正整数n的阶层n!=1*2*...*n尾部连续零的个数。
试统计正整数n的阶层n!=12-*n尾部连续零的个数. 思路: 首先通过常用对数累加和s=lg2+lg3+-+lg n确定n!的位数m=s+1,即a数组元素的个数.设计两重循环,模拟整数竖式乘法实施各 ...
- python计算n阶乘中尾部零的个数_(Java)设计一个算法,计算出n阶乘中尾部零的个数...
展开全部 long 类型对大数阶乘来e68a8462616964757a686964616f31333365633963说存储范围大小,强行使用会溢出,可以使用 BigDecimal. 代码如下:im ...
- n的阶乘末尾含有“0”的个数
关于这道题,见过两种问法: 给定参数n(n为正整数),请计算n的阶乘n!末尾所含"0"的个数. (n!%(10^k)) == 0.已知n,求能使上式成立的K的最大值. 问题分析: ...
- 计算n阶乘中尾部零的个数
计算因数5的个数即可 long long NumOfZero(long long n){long long count=0;while(n>0){count+=n/5;n=n/5;}return ...
- 【LeetCode 172. 阶乘后的零】
LeetCode 172. 阶乘后的零 题目描述 解题思路 class Solution {public int trailingZeroes(int n) {//思路//计算阶乘后为零的个数 因为2 ...
- 【算法】计算n阶乘中尾部0的个数
题目 设计一个算法,计算出n阶乘中尾部零的个数样例 11! = 39916800,因此应该返回 2挑战 O(logN)的时间复杂度 题目分析 n阶乘中,尾部出现的零是10和10的倍数相乘的结果,尾部出 ...
- C语言给定数字n阶乘的末尾计算零个数(附完整源码)
给定数字n阶乘的末尾计算零个数 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) 给定数字n阶乘的末尾计算零个数完整源码(main函数测试) #include <math.h> ...
- java 阶乘尾部的零,阶乘算法全集,阶乘末尾非零位,阶末尾零的个数
阶乘相关算法及程序 有关阶乘的算法,不外乎两个方面:一是高精度计算:二是与数论相关. 一. 高精度计算阶乘 这实际上是最没有技术含量的问题,但是又会经常用到,所以还是得编写,优化它的计算. 首先看小于 ...
最新文章
- C# 3.0/3.5语法新特性示例汇总[转]
- 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(三)
- Intellij Idea 使用
- 【软件设计师】2020-08-05
- java provider_Java SPI(Service Provider Interface)
- 启动一个Java进程
- 循环队列及C语言实现三
- Vue cli3使用jQuery控件
- mysql 里的1对n虚线_mysql workbench EER图,里面的实线以及虚线的关系
- 分享5个国外较好的图片网站
- 单片机温度传感器c语言编码,温度传感器代码解析Ⅱ
- 批处理打开/关闭休眠
- android控制wifi,Android控制wifi开关
- SPSS免费安装教程(详细版)
- python分析谷歌浏览器的历史记录
- 【yolov3】如何使用摄像头进行目标检测——yolov3-pytorch摄像头检测教程
- 64位 Eclipse IDE for Java EE Developers 下载地址
- 红石外汇|每日分享:0.667是澳元多头在FOMC会议前的最后一道防线
- 函数的返回值——数组返回
- conda 安装太慢
热门文章
- 计算机中复合模板在哪,冷冲模CAD系统中装配模板的设计与复合算法研究-计算机软件专业论文.docx...
- linux git添加密钥,centos – 无法在Gitlab上创建项目或添加ssh密钥
- eeprom和编程器固件 k2_用编程器免拆夹子刷斐讯K2 K2P解决难搞固件 刷BREED 无损原EEPROM...
- php三年经验 多少工资_PHP2年以上经验,在深圳工资能拿多少?
- SimpleDateFormat的parse与format的用法区别
- CVE-2021-35464: ForgeRock AM远程代码执行漏洞
- XSS-Game level 6
- 归并算法(分割与合并)
- win7充当无线路由器
- 部署点评Cat监控项目(转)