计算阶乘结果的数字尾随零

2023-12-27

我正在尝试计算由阶乘产生的数字的尾随零(这意味着数字变得非常大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。然而,当数量大约为25!, numZeros 不起作用。

public static void main(String[] args) {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    double fact;
    int answer;
        
    try {
        int number = Integer.parseInt(br.readLine());
        fact = factorial(number);
        answer = numZeros(fact);
    }
    catch (NumberFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static double factorial (int num) {
    double total = 1;
    for (int i = 1; i <= num; i++) {
        total *= i;
    }
    return total;
}   

public static int numZeros (double num) {
    int count = 0;
    int last = 0;   

    while (last == 0) {
        last = (int) (num % 10);
        num = num / 10;
        count++;
    }
    
    return count-1;
}

我并不担心这段代码的效率,而且我知道有多种方法可以使这段代码的效率更好。我想要弄清楚的是为什么计算大于的数字的尾随零25!不管用。

有任何想法吗?


您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案使用以下公式http://en.wikipedia.org/wiki/Trailing_zeros http://en.wikipedia.org/wiki/Trailing_zeros(你可以尝试证明)

def zeroes(n):
    i = 1
    result = 0
    while n >= i:
        i *= 5
        result += n/i  # (taking floor, just like Python or Java does)
    return result

希望你能把这个翻译成Java。这只是计算 [n / 5] + [n / 25] + [n / 125] + [n / 625] + ... 并在除数大于 n 时停止。

不要使用大整数。这是一个 bozosort。对于大量数据,此类解决方案需要数秒的时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算阶乘结果的数字尾随零 的相关文章

随机推荐