nyoj84 阶乘的0

阶乘的0

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述
计算n!的十进制表示最后有多少个0

输入
第一行输入一个整数N表示测试数据的组数(1<=N<=100)

每组测试数据占一行,都只有一个整数M(0<=M<=10000000)

输出
输出M的阶乘的十进制表示中最后0的个数

比如5!=120则最后的0的个数为1

样例输入
6
3
60
100
1024
23456
8735373
样例输出
0
14
24
253
5861
2183837

解题思路:因为在质数中,只有2和5相乘才会在尾部出现一个"0",那么只要将m分解质因数,然后统计2和5的个数,其中较小的一个就是答案。

进一步来说,m分解质因数之后,2的个数绝对比5多,

那么问题进一步简化,只要统计出所有的质因数中有多少个5即可。

例如:

1-->100中5的倍数

有 5 ,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100.

20 个5

但是除以5后还有可分解为5的

5                       10                     15                      20

此时有4个5

就是说1-->100共有24个5;即所求的0的个数

代码运用递归求5的个数:如下:

#include <stdio.h>
int Count=0;//计数
int factorial(int m)
{
	if(m==0)
		return Count;
	else
	{
		Count+=m/5;
		return factorial(m/5);
	}
}
int main()
{
	int m;
	int n;
	scanf("%d",&n);
	while(n--)
	{
		Count=0;
		scanf("%d",&m);
		printf("%d\n",factorial(m));//递归操作实现
	}
	return 0;
}
时间: 2024-10-12 20:47:41

nyoj84 阶乘的0的相关文章

1003 阶乘后面0的数量

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1其实只要循环除五就可以找到规律,其实也可以证明出来. 1 #include <iostream> 2 #include <cstdio> 3 #

51Nod 1003 阶乘后面0的数量 | 思维

题意:n的阶乘后面0的个数,如果直接算出阶乘再数0的数量一定会超时的. 因为10=2*5,所以求出5贡献的次数就行. #include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3f #define PI acos(-1) #define N 510 LL arr[N]; int main() { int n,k; while(~scanf("%d"

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10

阶乘中0的个数

任何一个数分解质因数后,表达为2的x1次方   *     3的x2次方   *    5 的x3次方  等等 0的来源于2*5,x1>x2 ,所以阶乘中0的个数为5的个数,下面就很简单了. http://acm.nyist.net/JudgeOnline/problem.php?pid=84 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-ge

51Nod 1003 阶乘后面0的数量(数学,思维题)

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003编程之美有讲:一个数 n

ACM 阶乘的0

阶乘的0 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100)每组测试数据占一行,都只有一个整数M(0<=M<=10000000) 输出 输出M的阶乘的十进制表示中最后0的个数比如5!=120则最后的0的个数为1 样例输入 6 3 60 100 1024 23456 8735373 样例输出 0 14 24 253 5861 2183837 令f(x)表示

正数阶乘结尾0的个数

题目:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题). 刚看到这道题,脑子中一闪而过的肯定是最原始的方法,但是仔细看看题目,不考虑超出计算机整数边界的问题.显然如果数据过大,求阶乘本身就是个复杂的计算,然后再找结果尾数为0的个数. 1.这个问题当然有简便的方法,我们这样思考,结尾0的个数,就是乘积是10的倍数,因子中有多少个10 就有多少个零,10再次分解就

阶乘末尾0的个数(证明)

先给出算法: 给定n,求n的阶乘末尾0的个数. int res = 0; while (n > 0) { res += n / 5; n /= 5; } 因为: 比方说求15的阶乘,也就是求 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13 × 14 × 15 的末尾0的个数.现在我们把这15个数分解出来含有5的因子 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 2   × 11 × 12 × 13 × 14 ×

阶乘后面0的数量

题目描述: n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 每个数阶乘末尾的零是由前面阶乘数字中的因子2和因子5相乘而造成的,又因为5比2多,所以只需考虑5的个数.每隔5个数,会产生一个0,如5.10.15...:每隔25个数,会多产生一个0,即两个0,如25/50/75...:每隔125个数,会多产生一个0,即三个0,如125.625...等等.即每次将除以5后