Project Euler Prob#3的推理因子分解错误

时间:2015-01-25 23:16:00

标签: c++ segmentation-fault prime-factoring

我16岁学习用C ++编写代码。我被建议查看一些项目的欧拉问题作为课程附加,我真的很喜欢它们,但我坚持问题3。 任务是在我的代码中找到数字n的最高素数因子。 我研究了我的问题,valgrind传递了代码。

 //
//  7.cpp
//  Thom's Playground
//
//  Created by Thom Foster on 25/01/2015.
//  Find the largest prime factor
//

#include <iostream>
using namespace std;

// Two Routines
//  - Find the highest factor
//  - Out of all those factors, find the highest one which is prime

int main(){

    int HPF;

// FIND THE HIGHEST FACTOR - METHOD 1
    // Initialise the number to find the HPF of , n.
    unsigned long long n = 66761275016;
    // Initialise an array to store the factors, f, with size of n+1, and f[0] is 0
    long long f[n+1];
    f[0] = 0;
    // Divide my nummber (n), by every number up to and including n, where the divisor of n is i
    for (long long i = 1 ; i <= n ; i ++){
        // After each value of i, check if the remainder of n / i is 0.
        if (n % i == 0){
            // If it is, add this to the array of factors, f, in the position f[i], where i is the state of the for loop.
            f[i] = i;
        } // End of if statement
        else {
            f[i] = 0;
        } // End of else
    } // End of for loop

// WHICH OF THOSE FACTORS IS THE HIGHEST PRIME

   for ( long long j = 1 ; j < n+1 ; j++){
       if (f[n-j+1] != 0){
           long long x = f[n-j+1];
           // Start of check prime function
                long long i = 2;
                while ( x % i != 0 && i <= x ){
                    i = i + 1;
                    }
           if (x == i) {
               cout << x << " is prime" << endl;
               return 0;
           }

                else cout << x << " was violated" << endl;
        // end of check prime function
       } // End of check factor if
   } // End of for
} // End of main

这适用于大约6位数以下的所有数字,之后我得到了分段错误11。 提前致谢, 汤姆

2 个答案:

答案 0 :(得分:0)

问题在于:

unsigned long long n = 66761275016;
// Initialise an array to store the factors, f, with size of n+1, and f[0] is 0
long long f[n+1];

在普通PC中,你真的无法在RAM中分配大约500 GiB的堆栈空间。你必须重新考虑你的算法,不需要这个庞大的数组。

答案 1 :(得分:0)

你不需要做所有的工作;特别是,您不需要分配所有内存。这是一个简单的算法,可以快速计算适度大小的整数,包括Project Euler 3的整数:

function factors(n)
    f := 2
    while f * f <= n
        while n % f == 0
            output f
            n := n / f
        f := f + 1
    if n > 1
        output n

以递增的顺序输出 n 的素数因子。它通过试验分工,测试每个 f 以确定它是否是 n 的因子;当它找到一个因子时,它输出它,然后将 n 减少到其剩余的辅助因子。当 f × f 超过 n 时,可能没有剩余的素数因子,因此输出 n

有更快的算法来分解整数,包括其他的试验分裂变体。但是这种算法很简单,并且总是有效,并且在很多情况下都足够了。

祝你学习顺利。