小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0
C语言---求n的阶乘后面有多少个连续的0
题目描述:给定一个正整数n,返回n的阶乘尾部连续0的个数。
例如:(5,5*4*3*2*1=120,则返回1),(10,10*9*8*7*6*5*4*3*2*1=3628800,则返回2)
题目分析:首先拿到这道题,直接可以想到最简单的方法就是,通过循环算出这个值,然会取个位,减个位,统计一下个数即可。但是运行后就发现不可行,因为如果n稍微大一点,则算出的这个值就太大了,保存不了,且运行超时,所以这种方法不可行。
于是就得想别的方法了,最后上网查资料发现还有一种巧妙的解法,那就是将可以造成尾部出现0的情况进行分析,发现10可以由2*5造成,发现20可以由2*2*5造成,发现100可以由2*2*5*5造成。。。
多试几组数据,可以发现其规律:尾部0的个数等于min{2的个数,5的个数}
因为尾部的0是由2*5得来的,虽然也可能是4*5得来的,但是4也是由2*2得来的,所以尾部的0根本上是由2*5得来的。
这里可以发现:一对2和5可以造成尾部一个0,n对2和5可以造成尾部n个0,但是由于2可以由太多太多的数据分解得来,所以我们这里主要看5的个数主要由哪些数分解得来即可:
比如:
5!= {1 * 2 * 3 * 4 * 5} 这里只有1个5,分别是5
10!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10} 这里有2个5,分别是5,10(10是由2*5组成的)
...
25!= {1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * ... * 21 * 22 * 23 * 24 * 25} 这里有6个5,分别是 5,10,15,20,25(25是由5*5组成的,所以25算2个5)
...
125!= {1 * 2 * 3 * 4 * 5 * ... * 25 * ... * 50 * ... * 75 * ... * 100 * ... * 121 * 122 * 123 * 124 * 125}这里有31个5,分别是5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125,
(这里除了25,50,75,100各自是由5*5组成,算两个5,而125是由5*5*5组成的,所以125单独算三个5)
我们可以发现每隔上5个数会出现一个5,隔上25个数又单独多出来一个5,隔上125个数又单独多出来两个5...
所以我们可以这样编写代码:
①:首先可以从1 -> n隔上5个数抽取一次,获取这些数组成一个数列
②:如果上面数列的个数>=5,就再从上面数列中再隔上5个数抽取一次,获取这些数组成一个新的数列
⑤:如果上面数列的个数>=5,就再从上面数列中再隔上5个数抽取一次,获取这些数组成一个新的数列(直到获取的数列中的数的个数小于5,则停止)
例如求125的阶乘后面有多少连续的0:
这里用tmp统计5出现的个数
①:第一遍获取可以得到单5:{5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100,105,110,115,120,125},所以tmp = 25
②:因为其个数肯定 >= 5,所以进行第二遍获取可以得到5*5:{25,50,75,100,125},所以tmp = 25 + 5 = 30
③:因为其个数刚刚好 == 5,所以进行第三遍获取可以得到5*5*5:{125},
所以tmp = 25 + 5 + 1 = 31
④:因为其个数肯定 <=5,所以不进行第四遍获取,直接退出循环即可。
所以我们可以得到125的阶乘后面有31个连续的0
C语言代码如下:
#include
int num(int n)
{
if(n < 0)//只要正整数,防止负数
{
return -1;
}
int i = 0;
int j = 5;//逐层按 5 5*5 5*5*5 进行抽取
int count = n;//统计逐次抽出了多少个数,初始值个数为总体个数
int tmp = 0;//统计5的个数
while(count >= 5)
{
count = 0;//进来后第一件事,让其先归零,重新统计抽取个数
i = 0;//进来后第一件事,也让i归零,因为i要从头开始遍历
while(i + j <= n)
{
tmp++;
i += j;
count++;
}
j *= 5;//第一遍隔5读取 第二遍隔5*5读取,下一次就是5*5*5,依次递增
}
return tmp;
}
int main()
{
printf("%d\n", num(125));
printf("%d\n", num(25));
printf("%d\n", num(12));
printf("%d\n", num(0));
printf("%d\n", num(-1));
return 0;
}
测试一下代码,结果如下:
至此,这道巧妙的题解决了。
小学 n 阶乘的后面包含多少零c语言,C语言---求n的阶乘后面有多少个连续的0相关推荐
- 诺禾-C语言实现尾递归求7的阶乘
如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的.当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归.尾递归函数的特点是在 ...
- C语言---求n的阶乘后面有多少个连续的0
C语言---求n的阶乘后面有多少个连续的0 题目描述:给定一个正整数n,返回n的阶乘尾部连续0的个数. 例如:(5,5*4*3*2*1=120,则返回1),(10,10*9*8*7*6*5*4*3*2 ...
- 阶乘在c语言代码大全,求10000的阶乘(c语言代码实现)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* 程序功能:计算一个正整数n的阶乘,目前最大能运算10000的阶乘,可秒杀. 程序意义:加强自己对于大数的处理. 说明:此程序对乘法和除法还未做任何优 ...
- c语言fac函数求n的阶乘,急求C语言编辑题:Cnm=n!/m!(n-m)!其中n,m 由键盘输入。要求设计一个函数fac(n)求某个正整数n 的阶乘。...
急求C语言编辑题:Cnm=n!/m!(n-m)!其中n,m 由键盘输入.要求设计一个函数fac(n)求某个正整数n 的阶乘. 來源:互聯網 2010-05-29 01:44:10 評論 分類: 電 ...
- matlab 求n 的和,MATLAB求1的阶乘加到n的阶乘和 不要现有的函数,要自己编写出来的...
点击查看MATLAB求1的阶乘加到n的阶乘和 不要现有的函数,要自己编写出来的具体信息 答:myfactorial = @(n) factorial(n) myfactorial = @(n) pro ...
- matlab编写正整数阶乘函数,用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值....
点击查看用matlab语言编写程序:编写一个计算阶乘的函数,再编写一个脚本文件,通过键盘输入计算阶乘的n值.具体信息 答:编写一个matlab文件,求1到n的阶乘之和.其代码编写的目的,就是学会自定义 ...
- C语言编程求三位数各位之和,C趣味程序(二)(04)求三位阶乘和数
1.5 阶乘和数 一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数. 例如,145=1!+4!+5!,则145是一个三位阶详细和数.是否还有其它三位阶乘和数?共有多少个阶乘和数? 1. ...
- 编一个函数求n的阶乘;使用for语句和while语句求n的阶乘;关于简单阶乘的求和(C)
养成好习惯,点个赞 再走:有问题,欢迎私信.评论,我看到都会回复的 以下是关于阶乘的题目,熟悉一下阶乘的各种玩法 文章目录 编一个函数求n的阶乘,主函数进行相关运算 for语句输出n的阶乘 while ...
- 1131: 零起点学算法38——求阶乘和
1131: 零起点学算法38--求阶乘和 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Submitted: 2719 ...
最新文章
- 影响HP服务器的磁盘性能的重要因素 -- 阵列卡的缓存和电池
- 联不上网 Unable to initialize Windows Sockets interface. General failure.
- lisp xy轴不等比缩放_UV的详细解释,不懂得赶紧看过来!
- java公寓管理系统设计与实现_宿舍管理系统设计与实现
- 机器学习实战(笔记)------------KNN算法
- 按任意字段排序的分页存储过程
- JavaScript之jQuery够用即可(查找筛选器、属性操作、jQuery文档处理)
- android-ndk-aide,NDK安装教程20180605
- mysql主从(一)--搭建(GTID+row+增强半同步)
- 伺服扭矩模式怎么控制_气液增压缸是怎么增压的?气液增压缸好用吗?气液增压缸的原理及其伺服控制...
- My third homework
- 《程序是怎样跑起来的》七
- mysql delphi_delphi 7 连接 MySql
- 语音计算机怎么切换音乐模式,怎么实现一个设备播放一个程序的声音呢?
- python簇状柱形图_think-cell chart系列13——簇状堆积柱形图
- mysql 2037年,正确的方法来存储2037年之后的MySQL日期
- LMC7660即-5V产生电路
- 连接网络打印机报错0x000003e3
- linux下的定时任务
- mac数字键盘错乱_苹果电脑键盘打不出数字解决办法
热门文章
- 【CVPR2020 image caption】读Meshed-Memory Transformer for Image Captioning
- 【虚拟化】docker构建私有仓库,上传镜像至私有仓库
- Centos下Linux下解决root用户Operation not permitted
- Java判断上传的文件是否是图片,如果是就对上传的图片进行压缩
- MyBatis Plus——忽略某个实体类属性和数据库表字段之间的映射关系
- Vasya and Robot
- 【学习笔记】Redis的geohash数据结构介绍
- python 类 对象 魔法方法概念+习题
- hadoop-1.1.2 在centos环境下的部署
- Nginx网站服务器