Java 编写一个程序,计算给定数字的阶乘中尾随零的数量。N!=1 * 2 * 3 * ... * N

Java 编写一个程序,计算给定数字的阶乘中尾随零的数量。N!=1 * 2 * 3 * ... * N,java,Java,这是我针对代码战争问题(Java)编写的代码,但我无法让它工作。我很确定我在某个地方犯了一个愚蠢的错误,因为我缺乏经验(编码4个月) 公共静态整数零(整数n){ int f=1; int零计数=0; 对于(int i=2;i事实上,你不需要计算阶乘,因为它会迅速爆炸成一个巨大的数字,甚至会溢出很长的时间。你要做的是计算5和2的数量,2和n之间的每个数字都可以被除以 static int powersoffive(int n) { int p=0; while (n % 5 ==

这是我针对代码战争问题(Java)编写的代码,但我无法让它工作。我很确定我在某个地方犯了一个愚蠢的错误,因为我缺乏经验(编码4个月)

公共静态整数零(整数n){
int f=1;
int零计数=0;

对于(int i=2;i事实上,你不需要计算阶乘,因为它会迅速爆炸成一个巨大的数字,甚至会溢出很长的时间。你要做的是计算5和2的数量,2和n之间的每个数字都可以被除以

static int powersoffive(int n) {
    int p=0;
    while (n % 5 == 0) {
         p++;
         n /= 5;
     }
     return p;
}

 static int countzeros(int n) {
     int fives = 0;
     for (int i = 1; i <= n; i++) 
          fives += powersoffive(i);

     return fives;
}
static int poweroffice(int n){
int p=0;
而(n%5==0){
p++;
n/=5;
}
返回p;
}
静态整数计数零(整数n){
整数五=0;

对于(int i=1;i,正如其他用户所指出的,您的解决方案可能不会被接受,因为您正在计算的分解因子

关于您编写的代码,您犯了两个错误:

您以错误的方式计算阶乘。应该从循环中的
i=2
开始

for(int i = 2; i <= n; i++){
    f *= i;
}
你应该这样比较它们

if(m.equals("0"))
无论如何,这就是我解决问题的方法

public static int zeros(int n) {
    int zerocount = 0;
    for (int i = 5; n / i > 0; i *= 5) {
        zerocount += n / i;
    }
    return zerocount;
}

以10为基数表示的数字中的零是2*5。为了确定尾随零的数量,您需要确定您的数字可以除以10的次数,或者换句话说,2和5因子之和的最小值。由于5大于2,并且我们按顺序进行,因此5的数量将是尾随零的数目

一个简单的方法是将n/5四舍五入,但这只会给出可以被5整除的项目数。然而,例如,25可以被5整除两次。同样可以说大约50。125可以被5整除三次,不少于5

因此,算法如下所示:

int items = 0;
int power = 5;
while (power < n) {
    items += (int) (n / power);
    power *= 5;
}
static int calculate(int n)
{
    int result = 0;
    while (n > 0 ) {
        n /= 5;
        result += n;
    }
    return result;
}
int items=0;
整数倍=5;
while(功率

这里使用的是相对而言的小数值,但这只是概念的证明。

这里确实需要使用蛮力,整数无论如何都会溢出

在乘法运算中,尾随零仅作为2*5的结果出现

现在想象一下,阶乘由其素因子的乘积表示

请注意,对于每5(五)个,我们将始终有2(两)个

所以要计算零的数量,我们需要计算五的数量

这可以通过连续将N除以5并将结果相加来实现

在Java代码中,类似于以下内容:

int items = 0;
int power = 5;
while (power < n) {
    items += (int) (n / power);
    power *= 5;
}
static int calculate(int n)
{
    int result = 0;
    while (n > 0 ) {
        n /= 5;
        result += n;
    }
    return result;
}

您会遇到什么错误?您能正确缩进代码吗?您不需要实际计算阶乘,但需要一点数学知识。
13!=6227020800
因此使用
int
将在(和之后)溢出13.如果你使用一个
int
,并计算
n!
f*=i
-当
i
为零时会发生什么?参见示例代码。你必须导入min函数并将其放入一个类中。你不需要计算2的数量,因为每5个我们有2个2。所以我们只需要计算5个。@pm77-1:1,2,3,4,5:1个5和3个2。但是,好的,明白了。很多2:-)公共类解决方案{公共静态int-zeros(int-n){int-f=1;int-zerocount=0;for(int i=2;我当然不知道我能做到。这是一个很好的答案,我了解到阶乘中每5位数字最后都是额外的0,谢谢,祝你玩得愉快。使用你的算法,11将给出2@Tarik是的。1*2*3*4*5*6*7*8*9*10*11=39916800,它有2个尾随的0,所以2的结果是正确的。@Tarik-是吗试着计算它?好的,明白了。缺点是你必须计算一个潜在的巨大阶乘。@塔里克:不,你不需要计算任何阶乘。我只计算n,这是极限,而不是n!。这是一个非常快速的方法。