C++ 欧拉项目"3c"和"x2B ;+;程序崩溃

C++ 欧拉项目"3c"和"x2B ;+;程序崩溃,c++,C++,问题是: 13195的主要因子为5、7、13和29 数字600851475143中最大的素因子是什么 这是我在C语言中的尝试++ #include <bits/stdc++.h> using namespace std; void ProblemThree(long long int n) { bool prime[n]; memset(prime, true, sizeof(prime)); for (int i = 2; i * i < n; i+

问题是:

13195的主要因子为5、7、13和29

数字600851475143中最大的素因子是什么

这是我在C语言中的尝试++

#include <bits/stdc++.h>
using namespace std;

void ProblemThree(long long int n) {
    bool prime[n];
    memset(prime, true, sizeof(prime));
    for (int i = 2; i * i < n; i++) {
        if (prime[i]) {
            if (n % i == 0) {
                printf("d", i);
                for (int k = 2 * i; k <= n; k += i) {
                    prime[k] = false;
                }
            }
        }
    }
}

int main() {
    ProblemThree(600851475143);
}
#包括
使用名称空间std;
空洞问题三(长整型){
布尔素数[n];
memset(prime,true,sizeof(prime));
对于(int i=2;i*i对于(int k=2*i;k它会崩溃,因为您尝试分配的数组太大。因为您有一个要测试的数字,所以不需要存储中间结果,您可以继续计算该数字的素因子分解,并取最大因子

可以使用以下算法计算O(1)空间的解:

long long  maxPrimeFactor(long long n)
{
    long long maxPrimeFactor = 1;
    while (n%2 == 0)
    {
        n = n/2;
        maxPrimeFactor = 2;
    }

    // n must be odd at this point.  So we can skip 
    // one element (Note i = i +2)
    for (int i = 3; i <= sqrt(n); i = i+2)
    {
        while (n%i == 0)
        {
            maxPrimeFactor = max(maxPrimeFactor, i);
            n = n/i;
        }
    }

    if (n > 2){
        maxPrimeFactor = max(maxPrimeFactor, n);
    }

    return maxPrimeFactor;
}
long-long maxPrimeFactor(长n)
{
长maxPrimeFactor=1;
而(n%2==0)
{
n=n/2;
maxPrimeFactor=2;
}
//n在这一点上一定是奇数,所以我们可以跳过
//一个元件(注i=i+2)
对于(int i=3;i 2){
maxPrimeFactor=max(maxPrimeFactor,n);
}
返回maxPrimeFactor;
}

注意:代码没有经过测试,但它应该给出了想法,并且仍然可以正常工作。

它崩溃了,因为您尝试分配的数组太大。由于您只有一个数字要测试,因此不需要存储中间结果,您可以继续计算该数字的素因子分解,并取最大因子。

可以使用以下算法计算O(1)空间的解:

long long  maxPrimeFactor(long long n)
{
    long long maxPrimeFactor = 1;
    while (n%2 == 0)
    {
        n = n/2;
        maxPrimeFactor = 2;
    }

    // n must be odd at this point.  So we can skip 
    // one element (Note i = i +2)
    for (int i = 3; i <= sqrt(n); i = i+2)
    {
        while (n%i == 0)
        {
            maxPrimeFactor = max(maxPrimeFactor, i);
            n = n/i;
        }
    }

    if (n > 2){
        maxPrimeFactor = max(maxPrimeFactor, n);
    }

    return maxPrimeFactor;
}
long-long maxPrimeFactor(长n)
{
长maxPrimeFactor=1;
而(n%2==0)
{
n=n/2;
maxPrimeFactor=2;
}
//n在这一点上一定是奇数,所以我们可以跳过
//一个元件(注i=i+2)
对于(int i=3;i 2){
maxPrimeFactor=max(maxPrimeFactor,n);
}
返回maxPrimeFactor;
}

注意:代码未被测试,但它应该给出这个想法,并且仍然接近工作。

<代码>布尔Orth[n];< /C> >将是一个“可变长度数组”。VLAs不是标准C++特性。(尽管有些编译器不幸地接受它们作为扩展—使用gcc,将
-Wvla-Werror
添加到编译器命令行以确保不会意外使用它们)如果你想在C++中使用一个动态数组,使用<代码> STD::vector > < /> >不是标准C++,而<代码>使用命名空间STD;——这只是一个非常坏的习惯。当我们在上面的时候,<代码> PrtTf(“D”,I);只是错误的。<代码>布尔Orth[n];< /Cord>将是一个“可变长度数组”。VLAs不是标准C++特性(尽管有些编译器不幸地将它们作为GCC扩展),将“<代码> -WVLA-WError < /C>”添加到编译器命令行中,以确保您不会意外地使用它们。如果你想在C++中使用一个动态数组,使用<代码> STD::vector < /> >包含< /COD>不是标准C++,而<代码>使用命名空间STD;——虽然合法,但只是一个非常坏的习惯。
完全是错误的。听起来很可能。你不需要一个大小为n的数组。正如循环条件所建议的,你最多需要一个大小为sqrt(n)的数组。但你也不需要存储所有数组。@JamesFaix确实,这可以在O(1)中解决空间复杂度。听起来很有可能。你不需要大小为n的数组。正如循环条件所建议的,你最多需要一个大小为sqrt(n)的数组。但你也不需要存储所有数组。@JamesFaix确实,这可以在O(1)空间复杂度中解决。