当前位置: 首页 > news >正文

不要被阶乘吓倒

阶乘是个很有意思的函数,我们来看看两个跟阶乘相关的问题。
1、给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N! = 3628800,末尾就有两个0
2、求N! 的二进制表示中最低位1的位置
 
我们先分析第一个问题
我们发现0的个数,就是10的个数,而10是由2跟5组成的,但是,5的个数明显少于2,所以问题就转换为求5的个数。
 1 #include <iostream>
 2 using namespace std;
 3 // O(nlogn),思路:找0的个数,就是找10的个数,就是2*5的个数,2比5多,所以就是找5的个数,首先找到5的倍数,再判断这些数里面有多少个5
 4 int numOfZeros1(int n)
 5 {
 6     //i从1开始,当n为26时,那么i就是1,2,3,4,5
 7     //j就是5*i,所以对于的j就是5,10,15,20,25,第二个while循环找的就是j中有多少个5,像数字25,就有2个5
 8     //count表示的5的个数,即0的个数
 9     int i, j, count;
10     i = 1;
11     count = 0;
12     while (5 * i <= n)
13     {
14         j = 5 * i;
15         while (j % 5 == 0)
16         {
17             count++;
18             j = j / 5;
19         }
20         i++;
21     }
22     return count;
23 }
24 // o(logn),从时间复杂度上来说,优化的多。思路:n=26时,0的个数就是[26/25]+[26/5]=1+5=6
25 int numOfZeros2(int n)
26 {
27     int i, count;
28     i = 0;
29     count = 0;
30     while (n / 5)
31     {
32         count += n / 5;
33         n /= 5;
34     }
35     return count;
36 }
37 int main()
38 {
39     int n;
40     n = 125;
41     //test
42     cout<<numOfZeros1(n)<<endl;
43     cout<<numOfZeros2(n)<<endl;
44     system("pause");
45     return 0;
46 }

 

第二个问题的解答如下,分析也在代码中了

 1 #include <iostream>
 2 using namespace std;
 3 // o(logn),在二进制中,乘以2就表示多一个0,所以,1最低位的位置其实就是2个个数+1
 4 int indexOfOne(int n)
 5 {
 6     int i, count;
 7     i = 0;
 8     count = 0;
 9     //这里进行了一点点调整,更简洁了,可对比上面的代码,看看哪里调整了
10     while (n)
11     {
12         //注意除以2,都可以用右移来标识哦!!
13         n = n >> 1;
14         count += n;
15     }
16     return count + 1;
17 }
18 int main()
19 {
20     int n;
21     n = 3;
22     //test
23     cout<<indexOfOne(n)<<endl;
24     system("pause");
25     return 0;
26 }

 

转载于:https://www.cnblogs.com/chuanlong/p/3703784.html

相关文章:

  • unity3D知识点
  • Angularjs学习---官方phonecat实例学习angularjs step0 step1
  • yum KVM
  • NLP
  • NIO入门系列之第二章:通道和缓冲区
  • 我们为何要选择响应式设计?
  • Redhat 企业虚拟化应用案例合集
  • AWK命令如何输出单引号
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • 9. JDK、JRE 的下载安装配置
  • String类的intern()方法
  • django 快速搭建blog
  • 常用搜索引擎指令
  • 远程连接
  • Oracle 11g AWR 系列五:如何生成 AWR 报告?
  • Android 架构优化~MVP 架构改造
  • C++类中的特殊成员函数
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • ES6系列(二)变量的解构赋值
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript实现分页效果
  • Java比较器对数组,集合排序
  • JAVA并发编程--1.基础概念
  • REST架构的思考
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 前言-如何学习区块链
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​渐进式Web应用PWA的未来
  • #WEB前端(HTML属性)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)c52学习之旅-独立按键
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (小白学Java)Java简介和基本配置
  • (转)Linq学习笔记
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)四层和七层负载均衡的区别
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *2 echo、printf、mkdir命令的应用
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET MVC 验证码
  • .NET 设计模式初探
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net程序帮助文档制作
  • .NET多线程执行函数
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @Controller和@RestController的区别?
  • @NestedConfigurationProperty 注解用法
  • @RequestMapping-占位符映射
  • @Valid和@NotNull字段校验使用