当前位置: 首页 > 知识库问答 >
问题:

阶乘尾随零BigO问题

束帅
2023-03-14

当我提交给leetcode时,它运行案例500/502,但失败了,原因是:1808548329。但当我在自己的mac上运行它时,它给出了与公认的答案相同的答案。

我的代码:

int trailingZeroes(int n) {
    int count = 0;
    int tmp = 0; //check every number in [1, i]
    for (int i = 1; i <= n; i++) {
        tmp = i;
        while (tmp % 5 == 0) {
            count++;
            tmp /= 5;
        }
    }
    return count;
}

交流答案是:

int trailingZeroes2(int n) {
    return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5);
}

它们在我的mac上运行相同的结果:

std::cout << trailingZeroes(1808548329) << std::endl; //452137076
std::cout << trailingZeroes2(1808548329) << std::endl; //452137076

第一个解决方案之所以不被接受,是因为时间复杂度 (因为我在自己的mac上运行它,但它给出了与ac相同的答案)

如何计算第一个解决方案的时间复杂度,

它是O(NlogN)吗?我不确定。你能帮我个忙吗?:-)

编辑,删除图片。

共有1个答案

曾歌者
2023-03-14

你的解是O(n)。

  • 内循环至少每5项重复一次
  • 内循环每25项至少重复两次
  • 内部循环每5k个项目至少重复k次

将其相加会使您的内部循环运行:

n/5 + n/25 + n/125 + ... + 1 = 
n (1/5 + 1/25 + 1/125 + ... + 1/n)

这是几何级数的总和,在O(n)

此外,如果忽略内部循环,外部循环本身具有O(n)迭代,每个成本不变,因此这仍然是O(n)

然而,替代解决方案在O(logn)中运行,效率显著提高。

 类似资料:
  • 问题内容: 我正在尝试计算阶乘产生的数字的尾随零(这意味着数字变得很大)。以下代码采用一个数字,计算该数字的阶乘,并计算尾随零。但是,当数字大约为25!时,numZeros将不起作用。 我并不担心这段代码的效率,并且我知道有多种方法可以使这段代码的效率更好。我要弄清楚的是为什么计数大于25的数字结尾的零!不管用。 有任何想法吗? 问题答案: 您的任务不是计算阶乘,而是计算零的数量。一个好的解决方案

  • 我是C编程新手,我想找出给定数的阶乘中尾随零的数量 我尝试计算数字的模,它将返回给定数字的最后一位作为余数,然后将删除最后一个数字。 执行程序后,输出总是将尾随零的数量显示为“0”,如果(ln=!0)条件始终得到满足,即使存在零。

  • 我试图计算给定数字的阶乘中尾随零的数量,例如。, ,其中尾随零 ,其中尾随零 我的问题是,我有一个像df这样的数据帧 我知道R中的阶乘是用来计算阶乘的,但我不知道如何计算尾部的零。任何帮助都将不胜感激!

  • 我试图计算阶乘中尾随零的数量。 我认为尾随零的数量不正确。 使用计数(30)时,30中有7个尾随的0。然而,它正在返回6。

  • 我试图改进大数的阶乘计算的运行时间。 第一个简单循环和乘法的代码。 此函数的分析结果: 对于n=1000--总时间:0.001115 s for n=10000--总时间:0.035327 s 对于n=100000——总时间:3.77454 s。 从n=100000的测线仪中,我可以看到大部分时间都花在乘法步骤上,即“98.8” 因此,试图将阶乘乘法减少一半,对于偶数,因此进行了强度减少。 后半部

  • 我试图解决代码战问题,称为:N的尾随零的数量!和哈斯克尔。我知道我不需要计算阶乘来知道尾随零,事实上我只是计算有多少个数字可以被5整除,以及每个数字可以被5整除多少次。我写了两个版本,一个版本在对一个数字进行去噪时使用回忆录,以得到可以被5整除的次数,另一个版本不使用回忆录。令我惊讶的是,假设的DP方法比普通的递归方法耗时更长。我可能在代码中做了一些非常愚蠢的事情。 以下是功能: 我试图记下的是默