开始看到这道题目的时候,我还以为是利用字符串表示整型数的思想,后来一看,由于是一个数的阶乘,那么,如果这个数本身就很大,那么,即使是利用字符串表示也是不合理的,所以,看了下这道题的解释,书中给出了一个公式之后就明白了题目的意思。

首先,我先把函数声明和题目要求贴出来:

/*2.2 不要被阶乘吓倒*/
/*2.2.1 N!的末尾有多少个0*/
int DutCountOf0InFactorialN(int);
/*2.2.2 N!的二进制表示中最低位1的位置*/
int DutPositionOf1InFactorialN(int);

我们想这样一个问题,有一个数N,那么1-N中存在多少个c(c >= 1 && c <= 9)呢?我们可以利用这个公式计算:

1-N中存在x的个数的计算公式为:N/x + N/x2 + N/x3 +...,且这个公式最后一定是收敛的

所以,可以写出如下的代码:

/*2.2.1 N!的末尾有多少个0*/
/*这道题目的解题思想是:2 * 5 = 10,所以,我们只要确定1—N中存在几个5就可以了(因为2有很多)*/
int DutCountOf0InFactorialN(int n)
{if (n <= 0)return 0;int count = 0;/*1-N中存在x的个数的计算公式为:N/x + N/x2 + N/x3 +...,且这个公式最后一定是收敛的*/while (n){n += n / 5;n /= 5;}/*返回末尾0的个数*/return count;
}/*2.2.2 N!的二进制表示中最低位1的位置*/
/*二进制中最低位1,所以,需要知道后面存在多少个0,由此,我们只要确定有多少个2就可以了*/
int DutPositionOf1InFactorialN(int n)
{if (n <= 0)return 0;int count = 0;/*1-N中存在x的个数的计算公式为:N/x + N/x2 + N/x3 +...,且这个公式最后一定是收敛的*/while (n){count += n / 2;n /= 2;}return count + 1;
}

编程之美2.2 不要被阶乘吓倒相关推荐

  1. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  2. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  3. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  4. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  5. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  6. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  7. c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度

    改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...

  8. 二叉树中节点的最大的距离(编程之美3.8)

    问题来源:<编程之美>3.8 求二叉树节点的最大距离 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数. 写一个程序求一 ...

  9. 编程之美1:那些关于1的个数的经典面试题

    那些关于1的个数的经典面试题 好长时间没有练算法了,笔试题一做,发现非常吃力,所以近日来找来<编程之美>一书来看看练练.为了激励自己多练,楼楼可能会出个专栏什么的,感兴趣的同学我们可以一起 ...

最新文章

  1. xslt 标签取集合第一条数据_XSLT函数集合:数值函数、字符串函、节点集函数和布尔函数...
  2. 网络编程学习笔记(recvfrom和sendto函数)
  3. 近世代数--唯一分解整环上的多项式环--唯一分解整环上的多项式环还是唯一分解整环
  4. 启动T0运行的C语言语句是,单片机填空题期末复习。、
  5. mysql 先删后增 更新_MySQL 高级操作——新增数据、更新数据、删除数据、查询数据...
  6. 一起来学SpringBoot | 第四篇:整合Thymeleaf模板
  7. 【转载】Java方向如何准备BAT技术面试答案(汇总版)
  8. 中移4G模块-ML302-OpenCpu开发-(MQTT连接阿里云-接收和发送数据)
  9. 微信图片怎么添加竖排文字_微信拍照的照片怎样加文字?
  10. 软件测试结果分析和质量报告
  11. C语言函数:even(n),fflush(stdin)
  12. 金蝶云苍穹开发实用整理
  13. 阿里云亮眼财报背后,云的打开方式正在重塑
  14. 一文搞懂谐波、纹波、噪声
  15. android 开发快捷键,Android开发部分快捷键总结
  16. mysql:triggers
  17. MySQL如何判断日期(datetime)是否是同一天
  18. DNS安全(一)DNS缓存投毒与防护
  19. fock join 列子
  20. 【Autosar Can网络远程唤醒】

热门文章

  1. div+css命名规范大全
  2. AIX 3D32B80D 错误
  3. Github连击200天(1)——ShowCase
  4. python学习笔记之函数(方法)
  5. Android之使用Jsoup抓取网络数据
  6. Zend SDK学习-1
  7. 设计模式实战 - 责任链模式
  8. 怎样Selenium IDE选择combo box中值
  9. exchange迁移测试作业
  10. [文摘20090224]天干和地支