我正在尝试编写代码来计算特定数字(大数字)的阶乘中尾随零的数量。但是,对于较小的数字,我会得到正确的结果,但是对于较大的数字,偏差会不断增加。我的逻辑怎么了

#include <stdio.h>

int main(void) {
    int t;

    scanf("%d", &t);
    while (t > 0) {
        int factorten = 0, factorfive = 0, factortwo = 0, remainingfive = 0,
            remainingtwo = 0;
        unsigned int factors = 0;
        unsigned int n;
        scanf("%u", &n);
        for (unsigned int i = n; i > 0; i--) {
            if (i % 10 == 0) {
                factorten++;
                continue;
            } else if (i % 5 == 0) {
                factorfive++;
                continue;
            } else if (i % 2 == 0) {
                // int new = i;
                // while(new % 2 == 0)
                //{
                // new = new / 2;
                factortwo++;
                //}
                continue;
            }
        }

        factors = factors + factorten;
        printf("%u\n", factors);
        if (factorfive % 2 == 0 && factorfive != 0) {
            factors = factors + (factorfive / 2);
        } else {
            remainingfive = factorfive % 2;
            factors = factors + ((factorfive - remainingfive) / 2);
        }
        printf("%u\n", factors);
        if (factortwo % 5 == 0 && factortwo != 0) {
            factors = factors + (factortwo / 5);
        } else {
            remainingtwo = factortwo % 5;
            factors = factors + ((factortwo - remainingtwo) / 5);
        }
        printf("%u\n", factors);
        if ((remainingfive * remainingtwo % 10) == 0 &&
            (remainingfive * remainingtwo % 10) != 0) {
            factors++;
        }
        printf("%u\n", factors);
        t--;
    }
}


样本输入:

6
3
60
100
1024
23456
8735373


样本输出:

0
14
24
253
5861
2183837


我的输出

0
13
23
235
5394
2009134

最佳答案

编辑:忽略前两个,它们是次优的。第三种算法是最佳的。

我认为这可以完成您要尝试做的事情,但是更加简单且有效:

int tzif(int n)
{
    int f2 = 0, f5 = 0;
    for (;n > 1; n--)
    {
        int x = n;
        for (;x % 2 == 0; x /= 2)
            f2++;
        for (;x % 5 == 0; x /= 5)
            f5++;
    }
    return f2 > f5 ? f5 : f2;
}


它计算数字N ... 2的2因子和5因子。然后它返回两者中的较小者(因为添加2因子在不添加5因子的情况下是无用的,反之亦然)。您的代码太奇怪了,我无法分析。

我认为这也应该起作用,因为阶乘将具有足够的2因子来“覆盖” 5因子:

int tzif(int n)
{
    int f5 = 0;
    for (;n > 1; n--)
        for (x = n;x % 5 == 0; x /= 5)
            f5++;

    return f5;
}


这仅计算5个因素并返回。

我认为应该起作用的另一种方法:

int tzif(int n)
{
    int f5 = 0;
    for (int d = 5; d <= n; d *= 5)
        f5 += n / d;

    return f5;
}


计算每五个数字(每个数字都有一个5因子),然后计数每个第25个数字(每个数字都有另一个5因子),依此类推。

关于c - 在阶乘中尾随零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25764514/

10-11 21:55