Math 100个阶乘总共有多少个零
我有一个家庭作业,在n阶乘中总计数为零。我该怎么办? 我只找到了计算阶乘尾部的方法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
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;
}