项目Euler#3 C ++程序崩溃

时间:2018-06-15 20:26:10

标签: 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++) {
        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);
}

程序意外崩溃,编译器没有显示错误。为什么这样,我怎么能阻止它发生?

1 个答案:

答案 0 :(得分:4)

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

您可以使用以下算法使用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;
}

注意:代码未经过测试,但它应该提出想法并且仍然接近工作。