我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。 提前致谢, 汤姆
答案 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 。
有更快的算法来分解整数,包括其他的试验分裂变体。但是这种算法很简单,并且总是有效,并且在很多情况下都足够了。
祝你学习顺利。