n! = 123*…*n

首先分析质因数2的个数

参考文献:https://www.cnblogs.com/daifei/p/3766015.html

算法:N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + …

推理:
  1. 将1.2.3…n的n个数以212^121的间距从1 开始划分。则在第一条数轴上的每一个能够整除212^121的点都至少有一个质因数2.则n!的质因数计数中,数轴上的每一个能够整除212^121的点都计数1,数轴上总的点数为 [n/2],即n整除以2,向下取整。
  2. 将1.2.3…n的n个数以212^121的间距从1 开始划分。
    则在第一条数轴上的每一个能够整除222^222的点都至少有一个质因数2.则n!的质因数计数中,数轴上的每一个能够整除222^222的点都计数1,数轴上总的点数为 [n/222^222],即n整除以222^222,向下取整。
  3. 综上,N!质因数2的个数 = [N / 2] + [N / 4] + [N / 8] + …
推论(利用二进制)
  • 例子1,二进制数: n = 10000(2)
    二进制数除以2即为右移一位。因此:
    n!n!n!的质因数2的个数为:[n/2]+[n/22]+[n/23......[n/2]+[n/2^2]+[n/2^3......[n/2]+[n/22]+[n/23......
    即:n!n!n!的质因数2的个数为:
    01000(2)+00100(2)+00010(2)+00001(2)=01111(2)=10000(2)-1
    则:
    10000(2) 的质因数2的个数为 :n−n的二进制表达式中1的个数n-n的二进制表达式中1的个数n−n的二进制表达式中1的个数

因此:

 int count=n;while(n>0){count-=n&0x1;n = n>>1;}return count;

若不考虑二进制,直接利用除法实现上述算法[N / 2] + [N / 4] + [N / 8] + …,则代码为:

 int count = 0;while(n>0){n= n/2;count +=n;}

分析质因数5的个数

算法:N!质因数2的个数 = [N/51]+[N/52]+[N/53]+....[N / 5^1] + [N / 5^2] + [N / 5^3] + ....[N/51]+[N/52]+[N/53]+....

推理略。
实例:求5进制数(4000)(5)中质因数5的个数。
利用上述2进制可知,(4000)(5) / 5相当于右移一位,结果为(0400)(5)。则(4000)(5)的质因数5的个数为:(0444)(5).相对于二进制来说,要保留原数的值,例如4.

代码如下

利用五进制
class Solution {public:/** @param n: A long integer* @return: An integer, denote the number of trailing zeros in n!*/long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.long long count=0;long num5[64],countNum[64] = {0};int i=0,j=0;long temp=1;while(n>0){   //转换为5进制i++;num5[i]=n%5;n=n/5;}num5[0]=i;  //记录5进制位数for(i=num5[0];i>1;i--){  //计算5进制表达式中非零数的计数个数for(j=1;j<i;j++){countNum[j] += num5[i];}}count+=countNum[1];for(i=2;i<num5[0];i++){  //将5进制表示为10进制temp *=5;count += countNum[i]*temp;}return count;}
};

直接利用除法实现:

class Solution {public:/** @param n: A long integer* @return: An integer, denote the number of trailing zeros in n!*/long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.long long count=0;while(n>0){n=n/5;count += n;}return count;}
};

分析n!n!n!的任意质因数的个数

质因数为x,则直接用除法实现

class Solution {public:/** @param n: A long integer* @return: An integer, denote the number of trailing zeros in n!*/long long trailingZeros(long long n) {// write your code here, try to do it without arithmetic operators.long long count=0;while(n>0){n=n/x;count += n;}return count;}
};

n!的任意质因数的个数相关推荐

  1. 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  2. java用流体加减乘除_任意输入两个数,完成加法、减法、乘法、除法运算!(加减乘除运算分别定义四个方法)_学小易找答案...

    [简答题]编写程序实现菜单设计 [简答题]一层平面图 [简答题]编写一个程序实现大小写字母转换 [简答题]利用循环语句输出一个五行的等腰三角形,如下图 [简答题]编写一个程序实现交换两个变量的数值. ...

  3. 质因数的个数 (分解质因数)

    链接:https://www.nowcoder.com/questionTerminal/20426b85f7fc4ba8b0844cc04807fbd9?f=discussion 来源:牛客网 [编 ...

  4. 求正整数N(N1)的质因数的个数,相同的质因数需要重复计算(java)

    package Four; /** 分解质因数* 素数常用来分解质因数,每个数都可以写成一个或几个质数相乘的形式* 其中每个质数都是这个数的质因数,把一个数用质因数相乘的形式表示出来,* 就称为分解质 ...

  5. 九度OJ 1207 质因数的个数

    题目地址:http://ac.jobdu.com/problem.php?pid=1207 题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3* ...

  6. [素数拓展] 质因数的个数 [2007年清华大学计算机研究生机试真题]

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=22235,共有5个质因数. 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1< ...

  7. c语言求三个数最值非函数,C语言编程:从键盘任意输入三个数,编写求其最大值、最小值的函数,用指针作函数参数实现。...

    www.shufadashi.com防采集. C语言编程:从键盘任意输入三个数,编写求其最大值.最小值的函数,用指针作函数参数实现.. #includevoid maxfunction(int*);v ...

  8. 牛客网 质因数的个数(质因数个数板题、清华机试)

    题目描述 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=22235,共有5个质因数. 输入描述: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N ...

  9. 算法-从1,...,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值

    题目: 从1,2,3,-..98,99,2015这100个数中任意选择若干个数(可能为0个数)求异或,试求异或的期望值. 解题思路: 这是阿里巴巴的一道笔试题目,这并不是一道编程类的题目(虽然可以用编 ...

最新文章

  1. JAVA逆向反混淆-追查Burpsuite的破解原理(转)
  2. 剑指offer 27: 二叉搜索树与双向链表
  3. centos7+ docker1.12 实践部署docker及配置direct_lvm
  4. 从代码层读懂Java HashMap的实现原理
  5. visio 形状_分享我Visio经验(问题从来都不是问题)
  6. 4-2 数据模型的生成
  7. 计算广告学涉及的学科与技术
  8. 由于系统限制了文件目录的读/写权限,程序将会退出,你可以重新安装百度网盘到有权限的目录或以管理员身份运行百度网盘。
  9. 迅雷 应版权方要求,文件无法下载 解决方法
  10. 45个纯 CSS 实现的精美边框效果【附源码】
  11. 用QT操作数据库(本周学的)
  12. 在 word 中加入 Mathtype 公式编辑器 解决办法
  13. mysql中exec语句_SQL语句-exec执行
  14. tomcat php centeros,linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境...
  15. 仅300员工却垄断全球,几亿一台还供不应求
  16. 浅析互联网金融对传统金融的影响
  17. 【taro +vue】初体验
  18. 变形金刚3:月黑之时1280超清迅雷下载
  19. 11大Java开源中文分词器的使用方法和分词效果对比(转)
  20. 移动聊天工具Kakao要开网络银行 牌照有望下月到手

热门文章

  1. 教MM如何用毛毛虫告诉你心仪的GG你怀春了
  2. 使用jackson进行字符串,集合和json之间的转换
  3. QT16进制、英文转换
  4. AI 已死?不,AIGC 给我们带来了新的希望
  5. 液晶显示屏的C语言编码,液晶屏代码讲解
  6. 文本溢出显示省略号,鼠标浮动查看全部内容
  7. 圣斗士图标:十二星座黄金圣衣
  8. 非库安装问题而报错Expected Ptr<cv::UMat> for argument ‘src‘
  9. PHPWord 表格居中和合并单元格
  10. VS C++万能头文件bits/stdc++.h的配置