n的阶乘结果中一共有多少个零?

题目:n的阶乘中一共有多少个零?

解答:产生零的结果只能有一种可能性那就是2*5=10,然而n的阶乘本质上是可以拆解为很多2和5以及其他不包含2和5的乘数的积,例如5的阶乘:1*2*3*4*5=1*2*3*2*2*5。按照这个思路,将n的阶乘乘积的每一项进行拆解,看看可以拆解出多少个2和多少个5,然后取2的个数和5的个数中最小的即可。程序代码如下:

#include <stdio.h>

int compute_zero(int n)
{
	int five_count = 0;
	int two_count = 0;
	int i, temp;

	for(i = 1; i <= n; i++)
	{
		temp = i;
		while(0 == temp%2) {temp /= 2; two_count ++;}
		temp = i;
		while(0 == temp%5) {temp /= 5; five_count ++;}
	}

	return (five_count > two_count ? two_count : five_count);
}

int compute_answer(int n)
{
	int answer = 1;
	int i;

	for(i = 1; i <= n; i++)
	{
		answer *= i;
		if(answer > 10000000) /*结果中只保留最多6个0*/
		{
			answer %= 10000000;
		}
	}

	return answer;
}

int main()
{
	int n;

	printf("Please input n:");
	scanf("%d", &n);
	printf("answer is: %d.\n", compute_answer(n));
	printf("Answer has zero %d.\n", compute_zero(n));

	return 0;
}

注:实测输入25没有问题,输入的数据过大的时候,compute_answer函数的计算结果可能会出错,本身compute_answer函数的结果也限制了结果的大小主要是显示了后面的低位高位就丢弃掉了,但是根据上面分析的compute_zero结果是不会出错的,这里将两个输出来主要是做一个对比。测试的结果如下所示:

时间: 2024-09-30 04:28:48

n的阶乘结果中一共有多少个零?的相关文章

求一个n!中尾数有多少个零

题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 示例1 输入 10 输出 2 解题思路: 能被5(5^1)整除的提供1个0 能被25(5^2)整除的提供2个0 能被125(5^3)整除的提供3个0 能被625(5^4)整除的提供4个0 所以 结果= n/5 + n/25 + n/125 + n/625 #include<io

N的阶乘末尾有多少个零?

在创联ifLab的招新问答卷上看到这么一题,大意是: 给出一个整数N,求N!(N的阶乘)的末尾有多少个零? 由于在N特别大的时候强行算出N!是不可能的,所以肯定要另找方法解决了. 首先,为什么末尾会有0?因为2*5 = 10,0就这么来了.所以只要求出这N!中有多少个2多少个5相乘就好了,由于2的出现次数肯定是大于5的,所以只要求有多少个5相乘就好了. 因为求的是N的阶乘,而 N! = 1*2*3*....*N 那么:这N个数中能被5整除的个数 = N / 5 比如N = 50 ,能被5整除的有

给定一个英文原文,统计文件里面一共有多少个不同的英文单词

wordsCounter.cpp // wordsCounter.cpp : Defines the entry point for the console application.// #include "stdafx.h"#include "wordsCounter.h" #ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif ////

递归解决战士打靶N坏一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

用1到9这九个数字变成三位数加三位数等于三位数的加法,例如:173+295 =468,一共有多少种情况?

#include "stdafx.h" #include <stdio.h> #include <vector> #include <algorithm> using namespace std; void FindCount(vector<int> &vect,int iPos,int &Count) { if (iPos>8) { int i1 = vect[0] * 100 + vect[1] * 10 + v

求N!中末尾有多少个0

分析: 对N进行质因数分解 N=2^x * 3^y * 5^z...,由于10 = 2*5,所以末尾0的个数只和x与z有关,每一对2和5相乘可以得到一个10,于是末尾0的个数=min(x,z).在实际中x是远远大于z的,所以我们只要求出z的值即可. 根据公式 z = N/5 + N/5^2 + N/5^3+...+N/5^k 这表明,5的倍数贡献了一个5,5^2的倍数又贡献了一个5.... 比如:25其实是贡献了2个5,但是在N/5中已经贡献了一个,所以在N/5^2中再贡献一个:同样,125在N

假设一对耗子每个月都可以生一对小耗子。小耗子生长3个月后,从第4个月开始也就能够生小耗子。问:假设所有的耗子都不死的话,那么20个月后一共有多少只耗子?

#include <stdio.h>void main(){ int i=0,old=2,first=0,second=0,third=0,sum=0; for(i=0;i<20;i++) { old=old+third; third=second; second=first; first=old; } sum=old+first+second+third; printf("20个月后一共有%d只耗子!\n",sum);} 分析图: 假设一对耗子每个月都可以生一对小耗

递归计算战士打靶S次打了N环一共有多少种可能的问题

问题描述 一个战士打了10次靶,一共打了90环,问一共有多少种可能,并输出这些可能的组合. 思路 首先,嵌套10层循环进行穷举是不可取的,一是因为速度太慢,二是如果改成打20次靶就完蛋了. 其实这就是一个树的搜索问题. 1. 设第一次打了0环,那么第二次可能打0 ~ 10环这些可能 2. 以第一次打的0环为root,将第二次所有可能的环数都做为root的子结点 3. 重复1, 2步 这样就构成了一棵树,表示当第一次打了0环时所有的可能性.我们要做的就是从上到下遍历这棵树,当经过的结点之和等于90

N!中末尾有多少个0

问题:先从100!的末尾有多少零         =>    再推广到  任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一个整数若含有一个因子5则必然会在求100!时产生一个零,                               问题转化为:求1到100,这100个整数中包含了多少个因子5.                                若整数N能被25整除,则N包含2个因子5,若N能被5整除,则N