求N!末尾所得数字0的个数

题目:给定一个整数N ,那么N 的阶乘N !末尾有多少个0呢?

例如:N = 10,N! = 3628800,所以N!末尾就有2个零。

分析:如果直接先算出N!阶乘,很容易导致内存溢出。显然,直接算出来是不行的。所以,我们可以换一个角度来分析这个问题。我们知道

  N! = 1*2*3*4*......*N,所以,我们可以对N!进行分解质因数。即N! = 2^x * 3^y * 5 ^z........可以看到2和5相乘,必然会产生一个零。那么问题就转化为2^x * 5^z可以产生多少个零就可以了。即求出min(x,z)。显然x大于z(能被2整除的肯定比能被5整除的多),故我们只需要求出1...N能够分解出多少个5就行了。

代码:

# python 版
def count_zero_number(value):
        if not isinstance(value,int):
                raise TypeError("参数必须为整型")
        res = 0
        if value <= 0:
            return 0
        i = 1
        while i <= value:
                j = i  # 保存当前i的值
                while j % 5 == 0:  # 判断当前值是否含有重复质数
                        count += 1
                        j = j // 5 # 更新j的值
                i += 1
        return count
# Cpp版
int count_zero_number(int value){
        if(value <=0)
              return 0;
        int ret = 0,i,j;
        for(i = 1;i < value;i++){
                j = i;
                while(j % 5 == 0){
                        ret++;
                        j /= 5;
        }
    }
    return ret ;
}
时间: 2024-12-19 16:21:27

求N!末尾所得数字0的个数的相关文章

求n! 末尾有多少个0

其实是求1到n 每个数的最小质因子有多少个5,有多少个5就有多少个0,因为2的个数明显大于5的个数 #include<iostream> using namespace std; int judge(int i){//计算i的最小质因子里有几个5 int cou=0; while(i%5==0){ cou++; i/=5; } return cou; } int main(){ int n; while(cin>>n){ int cou=0; int ans=0; for(int

算法-计算阶乘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的阶乘(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的个数

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

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

问题描述 给定参数n(n为正整数),请计算n的阶乘n!末尾所含有"0"的个数. 例如,5!=120,其末尾所含有的"0"的个数为1:10!= 3628800,其末尾所含有的"0"的个数为2:20!= 2432902008176640000,其末尾所含有的"0"的个数为4. 问题分析: 显然,对于阶乘增长速度的非常快的,很容易就溢出了.当然就不可能把阶乘算出来,而是要找规律解决.下面用因式分解的思路来考虑:末尾的0可以分解为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 >

正数阶乘结尾0的个数

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

阶乘尾数0的个数

题目:http://tonylin.top/Conpro/read/pid/1048/cid/100060 给出q,求最小的n满足n!的末尾零个数为q Input: 输入第一行为一个整数T(1 <= T <= 1000),表示测试数据有T组 2~T+1行 每行包含一个整数q(1 <= q <= 1e8),代表一组测试数据 Output: 对于每组测试数据,按照样例格式输出case number和n,如果没有可行解则输出"impossible"(不包含引号) Sa

(笔试题)N!尾部连续0的个数

题目: 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题) 思路: 1.直接计算N!的值,然后统计尾部0的个数,时间复杂度O(n): 2.发散思维,想想尾部为0的数是怎么得到的? 很容易想到2*5即可得到0,则N!可以表示为k*(2^m)*(5^n),由于在N!中m>>n,因此N!=k'*(2*5)^n,即n为尾部为0的个数. 由此,我们只要考虑N!中包含多少