【问题标题】:how to find all factors of a given number N with time complexity less then N?如何找到时间复杂度小于 N 的给定数 N 的所有因子?
【发布时间】:2014-07-31 14:28:17
【问题描述】:

我正在尝试这个,但是在输入>10000 这个循环 id 需要更多时间。

有什么方法可以优化这个时间复杂度小于 N 或 (logn) 的方法吗?

#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    int n = 10001;

    for (int i = 1; i < n; i++) {
        if (n % i == 0) {
            cout << i;
        }
    }
    return 0;
}

【问题讨论】:

标签: c++ factors


【解决方案1】:

除了dmh2000's answer:您可以在检查中利用冗余。例如,如果一个数字不能被n 整除,那么它也不能被n 的任何倍数整除。例如,不能被 2 整除的数也不能被 4、6 或 8 整除。

这种技术被称为sieving

【讨论】:

  • rahulk 想要所有因子,而不仅仅是所有素因子。
  • 这种技术就是这样做的。
  • “一个不能被 2 整除的数字也不能被 4、6 或 8 整除”这是真的,但它会产生相同的时间复杂度,因为我需要检查 4 是否是 2 的倍数或不是..在实现上是一样的
【解决方案2】:

您可以只迭代 n 的平方根而不是 n,因为任何大于平方根的都不能是 n 的因数。编辑:阅读 ComicSansMs 的答案比我的编辑好

【讨论】:

  • rahulk 想要所有因子,而不仅仅是所有素因子。
  • 您只能检查2odd numbers 波纹管sqrt(N)
  • @TonyK 所以?建议的方法让收集所有因素
  • 利用素因数,可以轻松生成除数。
  • @ST3:当然可以。但值得一提。我怀疑 dmh2000 只是误读了这个问题(就像我一开始所做的那样)。
【解决方案3】:

第一步是找到所有的主要因素,以及它们的多重性。然后您可以轻松生成因子。

平均而言,如果您明智地做到这一点,那么对于高达约 100000000 的数字,找到主要因素的速度非常快。如果你找到一个因素,你可以把它从n 中分出来,这在一般情况下大大减少了时间。此外,除了 2 之外,您只需要检查直到 sqrt(n) 的奇数因子:

// I assume n is non-zero
while (!(n & 1)) {
    cout << "2" << endl;
    n /= 2;
}
for (unsigned int factor = 3; factor * factor <= n; factor += 2) {
    while (n % factor == 0) {
        cout << factor << endl;
        n /= factor;
    }
if (n != 1)
    cout << n << endl;
}

【讨论】:

    【解决方案4】:

    如果您需要多次执行此操作,有一个很好的解决方案。我只举一个例子,实施将是你的事。


    假设您需要分解两个数字,例如580 和 72。

    首先你把它分解成素数

    580 = 2 x 2 x 5 x 29
    72 = 2 x 2 x 2 x 3 x 3
    

    使用缓存可以大大提高分解为素数的速度。您应该拥有包含所有已知素数的std::set&lt;int&gt;,因此在分解580 后,它包含2, 5, 29。这意味着分解72 你只需要确定3 是素数。

    在获得所有质因数后,您需要将它们以所有组合相乘以获得非质因数。


    正如我所提到的,这个解决方案真的很好,只有在你需要分解许多数字的情况下,但如果你只需要分解一次它还不错Sieving会更好。

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2016-07-29
      相关资源
      最近更新 更多