C++ 如何在时间复杂度小于N的情况下找到给定数N的所有因子?

C++ 如何在时间复杂度小于N的情况下找到给定数N的所有因子?,c++,factors,C++,Factors,我正在尝试这一点,但在输入>10000时,此循环id需要更多的时间 是否有任何方法可以优化时间复杂度小于N或(logn)的情况 #包括 使用名称空间std; int main(int argc,char*argv[]){ int n=10001; 对于(int i=1;i

我正在尝试这一点,但在输入>10000时,此循环id需要更多的时间

是否有任何方法可以优化时间复杂度小于N或(logn)的情况

#包括
使用名称空间std;
int main(int argc,char*argv[]){
int n=10001;
对于(int i=1;icout你可以迭代到n的平方根,而不是n,因为任何大于平方根的东西都不能是n的因子。编辑:阅读漫画答案比我的编辑好。你可以迭代到n的平方根,而不是n,因为任何大于平方根的东西都不能是n的因子。编辑:阅读漫画sMs answer比我的edit更好,除了:你可以利用检查中的冗余。例如,如果一个数字不能被
n
整除,它也不能被
n
的任何倍数整除。例如,不能被2整除的数字也不能被4、6或8整除


这种技术被称为。

此外,还可以利用检查中的冗余。例如,如果一个数字不能被
n
整除,它也不能被
n
的任意倍数整除。例如,不能被2整除的数字也不能被4、6或8整除


这项技术被称为。

第一步是找到所有素数因子及其多重性。然后您可以轻松生成因子

如果你做得明智的话,对于大约100000000的数字,找到素数因子的平均速度相当快。如果你找到了一个因子,你可以将它从
n
中分离出来,这在一般情况下大大缩短了时间。此外,你只需要检查sqrt(n)以下的奇数因子,除了2:

// 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;
}
//我假设n不是零
而(!(n&1)){

cout第一步是找到所有具有多重性的素因子,然后您可以轻松地生成因子

如果你做得明智的话,对于大约100000000的数字,找到素数因子的平均速度相当快。如果你找到了一个因子,你可以将它从
n
中分离出来,这在一般情况下大大缩短了时间。此外,你只需要检查sqrt(n)以下的奇数因子,除了2:

// 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;
}
//我假设n不是零
而(!(n&1)){

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


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

首先你把它分解成素数

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

在你有了所有的素因子之后,你需要在所有的组合中把它们相乘,得到非素因子



正如我所提到的,这个解决方案只有在你需要分解很多数字的情况下才是好的,但是如果你只需要分解一次,它就更好了。

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


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

首先你把它分解成素数

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

在你有了所有的素因子之后,你需要在所有的组合中把它们相乘,得到非素因子




正如我所提到的,这个解决方案只有在需要分解许多数字的情况下才有效,但如果只需要分解一次,效果会更好。

你可以使用算法。它非常快,不难实现。使用素因子可以生成除数。你需要执行一次或多次吗次数?如果用户输入300,那么我必须执行600次..twiceMaybe你可以从这个链接找到它,你可以使用算法。它真的很快,不难实现。用素数你可以生成除数。你需要执行一次或多次吗?如果用户输入300,那么我必须执行600次..两次也许你可以从这个链接上找到rahulk想要的是所有的因子,而不仅仅是所有的素因子。这个技术就是这么做的。“一个不能被2整除的数字也不能被4、6或8整除”这是真的,但它会造成同样的时间复杂度,因为我需要检查4是否是2的倍数。在实现中,它将是相同的Rahulk需要所有的因子,而不仅仅是所有的素因子。这种技术就是这样做的。“不能被2整除的数字也不能被4、6或8整除”这是真的,但它会造成同样的时间复杂度,因为我需要检查4是否是2的倍数。在实现中,它将是相同的Rahulk需要所有的因素,而不仅仅是所有的基本因素。您只能检查
2
奇数
bellow
sqrt(N)
@TonyK So?建议的方法让我们收集所有因子使用素数因子,可以轻松生成除数。@ST3:当然可以。但值得一提的是。我怀疑dmh2000只是误读了这个问题(就像我一开始做的那样).rahulk想要所有的因子,而不仅仅是所有的素因子。你只能检查
2
奇数
bellow
sqrt(N)
@TonyK So?建议的方法让我们收集所有因子使用素因子,除数可以是泛型