计算阶乘n!末尾所含的0的个数

问题描述

给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。

例如,5!=120,其末尾所含有的“0”的个数为1;10!= 3628800,其末尾所含有的“0”的个数为2;20!= 2432902008176640000,其末尾所含有的“0”的个数为4。

问题分析:

显然,对于阶乘增长速度的非常快的,很容易就溢出了。当然就不可能把阶乘算出来,而是要找规律解决。下面用因式分解的思路来考虑:末尾的0可以分解为2*5,一个5,一个2就对应一个0;

下面给出递推过程:

(1)当n<5 时,f(n) =0; 结论成立

(2)当n>=5 时,可以令 n!=[5k*5(k-1)…10*5]*a ,其中n=5k+r ,r(0<=r<5),a是一个不含因子的整数,可看出是一个满足条件的整数;

对于序列5k,5(k-1)…10*5 中在每一个5i中,在区间(5(i-1),5i)内存在一个偶数,即存在一个2与之对应。因此这里的k个‘5’因子 与n!中的末尾0个数是一一对应的。

所以递推公式转化为:

f(n!)=g(5^k * k! *a) = k + g(k!)= k+f(k!); k!是系数的相乘结果。

f(n!)=k+f(k!);

例如: f(5!)= 1+f(1!)=1;

f(10!)=2+f(2!)=2;

下面给出C++两种实现代码:.递归;非递归:

//递归
int n_jie_tail_zeors_recurise(int n)
{
    int zeros_num =0;
    int k;
    if(n < 5)
        return 0;
    for(k=5;k<=n;k+=5)
    {
        zeros_num++;
    }
    return zeros_num + n_jie_tail_zeors_recurise(zeros_num);
}
//非递归
int n_jie_tail_zeros_non_recurse(int n)
{
    int zeros_num =0;
    int temp = n;
    int k=0;
    int index=0;
    while(temp >5)
    {
        index =0;
        for(k =5;k<=temp;k+=5)
        {
            zeros_num++;
            index++;
        }
        temp = index;
    }
    return zeros_num;
}
时间: 2024-12-14 18:08:13

计算阶乘n!末尾所含的0的个数的相关文章

算法-计算阶乘n!末尾0的个数

算法逻辑转载自计算阶乘n!末尾0的个数: 问题描述    给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数.    例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 计算公式    这里先给出其计算公式,后面给出推导过程.    令f(x)表示正整数x末尾所含有的&q

计算阶乘n!末尾0的个数

一.问题描述 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数.例如: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 2432902008176640000,其末尾所含有的“0”的个数为4. 二.算法分析 此类问题很显然属于数学问题,一定要找到其中的本质规律才能得到正确的数学模型. 两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5.如果想到了这一点,那么就可以进一步想到:两个数相乘

求计算数中第一个1之后0 的个数

#include<iostream> #include<string.h> #include<cstdlib> using namespace std; char a[33]; int countOfZeros(int n) { int count=0; itoa(n,a,2); int len=strlen(a); //cout<<a<<" "<<len<<endl; for(int i=0;i<

计算n的阶乘(n!)末尾0的个数

题目: 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数. 举例: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 2432902008176640000,其末尾所含有的“0”的个数为4 解题思路: 两个大数字相乘,都可以拆分成多个质数相乘,而质数相乘结果尾数为0的,只可能是2*5.如果想到了这一点,那么就可以进一步想到:两个数相乘尾数0的个数其实就是依赖于2和5因子的个数.又因为每两个连续数字就会有一个因子2,个数

求N!末尾的0的个数--找规律+递归

0\'s Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 计算整数n!(n的阶乘)末尾有多少个0. 输入 第一行输入一个数T代表测试数据个数(T<=20).接下来T行每行1个数代表n(0<=n< 2^31). 输出 对于每个测试数据输n!末尾有多少个0,每行输出一个结果. 示例输入 3 1 5 10 示例输出 0 1 2 提示 中国海洋大学第三届"朗讯杯"编程比赛高级组试题 声明(摘抄至某前辈)--

整数阶乘结果的尾数的0的个数

问题描述     给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数.     例如,5!=120,其末尾所含有的“0”的个数为1:10!= 3628800,其末尾所含有的“0”的个数为2:20!= 2432902008176640000,其末尾所含有的“0”的个数为4.   计算公式    这里先给出其计算公式,后面给出推导过程.     令f(x)表示正整数x末尾所含有的“0”的个数,则有:       当0 < n < 5时,f(n!) = 0;       当n >

[华为机试练习题]46.计算二进制数的0的个数

题目 描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别: 位运算 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:计算二

计算二进制数的0的个数

描述:  输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别:  位运算  难度:  初级  运行时间限制: 无限制 内存限制: 无限制 阶段:  入职前练习  输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 完整代码: #include <iostream> using namespace std; int main() { int n; int cnt=0;

2015华为机试—— 计算二进制数的0的个数

描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别:位运算 难度:初级 运行时间限制:无限制 内存限制:无限制 阶段:入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 解题思路: 对于给定的数n,使用位运算:n=n&(n-1)可计算出对应二进制中1的个数,为count1.将input=n,input=input>>1逐个获取input中