Math 100个阶乘总共有多少个零

Math 100个阶乘总共有多少个零,math,Math,我有一个家庭作业,在n阶乘中总计数为零。我该怎么办? 我只找到了计算阶乘尾部的方法 static int findTrailingZeros(int n) { // Initialize result int count = 0; // Keep dividing n by powers // of 5 and update count for (int i = 5; n / i >= 1; i *= 5) coun

我有一个家庭作业,在n阶乘中总计数为零。我该怎么办? 我只找到了计算阶乘尾部的方法

static int findTrailingZeros(int n) 
{ 
    // Initialize result 
    int count = 0; 

    // Keep dividing n by powers  
    // of 5 and update count 
    for (int i = 5; n / i >= 1; i *= 5) 
        count += n / i; 

    return count; 
} 
那么这个怎么样

count = 0
s = str(fact)
for i in s:
    if i=="0":
        count +=1
print(count)

n!中的零总数由在线整数序列百科全书中的序列给出。似乎真的没有办法计算
n中零的总数缺少计算
n并计算零的数量。有了一个大的int库,这就足够简单了。一个简单的Python示例:

import math

def zeros(n): return str(math.factorial(n)).count('0')
因此,例如,
zero(100)
的计算结果为
30
。对于较大的
n
您可能希望跳过对字符串的相对昂贵的转换,并通过反复除以
10
以算术方式获得0计数

正如您所注意到的,计算尾随零的数量要容易得多。用Python编写的代码基本上是:

def trailing_zeros(n):
    count = 0
    p = 5
    while p <= n:
        count += n//p
        p *= 5
    return count
因此:

def est_zeros(n):
    #first compute the number of candidate postions for non-trailing zerpos:
    internal_digits = max(0,num_digits(n) - trailing_zeros(n) - 2)
    return trailing_zeros(n) + internal_digits//10 

例如,
est_zeros(100)
计算结果为37,这不是很好,但是没有理由认为这个估计比渐近估计更好(尽管证明它是渐近正确的非常困难,我不知道它是否是)。对于较大的数字,它似乎给出了合理的结果。例如
zero(10000)==5803
est_zero==5814

100!是一个大数字:

100! = 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
更精确地说,它需要约525位,如果没有某种形式的
bigint
math,就无法计算

但是,尾随的零可以在正常整数上计算:

这样做的目的是限制结果仍然适合您的数据类型。因此,在每次迭代测试之后,如果结果可以被10整除。如果是,则增加零计数器并将结果除以10。这同样适用于任何素数,除了那些除以10的素数:
2,5
(但不增加零计数器)。这样,您将得到小的子结果和尾随零的计数

因此,如果你对
n中的所有乘法器进行
2,5
因式分解
2,5的两个指数的最小值将是尾随零的数量,因为每对产生一个零位(
2*5=10
)。如果您意识到
5
的指数总是小于或等于
2
的指数,就足以对
5
进行因式分解(就像您在更新的代码中所做的那样)

int fact_training_zero(int n)
{
int i,n5;
对于(n5=0,i=5;n>=i;i*=5)n5+=n/i;
返回n5;
}
结果如下:

Trailing zeors of n!
       10! :         2
      100! :        24
     1000! :       249
    10000! :      2499
   100000! :     24999
  1000000! :    249998
 10000000! :   2499999
100000000! :  24999999
[   0.937 ms]
然而
100
还包含非尾随零,要计算这些零,除了在
bigint
数学上计算真实值外,别无选择。。。但这并不意味着没有像尾随零那样的解决方法

如果有帮助的话,这里有高达
128的计算阶乘以便您可以检查结果:


如果
n
被限定为足够小的值,您可以使用LUT将所有的阶乘保持为字符串或BCD并从那里开始计算零。。。或者甚至只有最后的结果作为一个LUT

这里有一些糟糕的代码,但它是有效的。只能使用TrailingZeros()

公共静态整数跟踪零(整数n)
{
var fac=阶乘(n);
var num=分割数(fac);
数组。反向(num);
int i=0;
int res=0;
while(num[i]==0)
{
如果(num[i]==0)
{
res++;
}
i++;
}
返回res;
}
公共静态BigInteger阶乘(整数)
{
BigInteger阶乘=1;//
对于(int i=2;i 0)
{
调整数组大小(参考结果,计数+1);
结果[计数]=(整数)(数字%10);
数字=数字/10;
计数++;
}
数组。反向(结果);
返回结果;
}

欢迎来到StackOverflow。你的问题不是很清楚。你是在问如何找到一个以十为底的阶乘中所有零位数的数目,包括但不限于阶乘末尾的零位数吗?另外,检查
n时
n
的可能值范围是多少?这似乎没有一个简单的公式。看,我没有看到任何直接的方法,除了用蛮力计算数字然后计算0的方法。另一方面,尾随的0问题是一个经典的难题,也是一个常见的家庭作业问题。你确定你读的作业正确吗?发问者只需要100个阶乘中的零。100! 里面有24个零。代码输出为24@vishakhamote 100!其中有30个零,尽管它有24个尾随零。在任何情况下,这段代码都只是OP在Python中的代码,因此绝不构成答案。如果要使用Python对其进行暴力攻击,只需使用
str(math.factorial(n)).count('0')
,因为
count
方法将比显式循环快得多。所有这些都没有真正帮助OP,因为他们似乎想要一个数学公式或Java代码。我建议去掉不必要的压痕。代码包含俄文注释:请保留,但请翻译成英文。
Trailing zeors of n!
       10! :         2
      100! :        24
     1000! :       249
    10000! :      2499
   100000! :     24999
  1000000! :    249998
 10000000! :   2499999
100000000! :  24999999
[   0.937 ms]
    public static int TrailingZeros(int n)
    {
        var fac = Factorial(n);
        var num = SplitNumber(fac);
        Array.Reverse(num);
        int i = 0;
        int res = 0;

        while (num[i] == 0)
        {
            if (num[i] == 0)
            {
                res++;
            }
            i++;
        }
        return res;
    }
    public static BigInteger Factorial(int number)
    {
        BigInteger factorial = 1;   // значение факториала

        for (int i = 2; i <= number; i++) 
        {
            factorial = factorial * i;
        }
        return factorial;
    }

    
    public static int[] SplitNumber(BigInteger number)
    {
        var result = new int[0];
        int count = 0;

        while (number > 0)
        {
            Array.Resize(ref result, count + 1);
            result[count] = (int)(number % 10);
            number = number / 10;
            count++;
        }
        Array.Reverse(result);
        return result;
    }