before I start I want to clarify that I am not looking for code examples to get the answer; that would defeat the object of Project Euler.
The problem can be found here http://projecteuler.net/problem=3
I think I have a way of solving the problem, but the Algorithm is VERY slow; it has been running for nearly two and a half hours now. So I am looking for general advice on optimisation.
Thanks.
#include<iostream>
using namespace std;
bool primality(int);
int main(){
long long lim = 600851475143;
long long div = lim/2;
bool run = true;
while(run){
if(lim%div==0 && primality(div)){
cout << "HPF: " << div;
run = false;
}
else{
div--;
}
if(div<=1){
break;
}
}
return 0;
}
bool primality(int num){
for(int i=2; i<num; i++){
if(num%i==0 && i!=num){
return false;
}
else{
return true;
}
}
}
If you start
divat 2 and count up instead of down, and divide it out from the number when the modulo is zero, you gain two big advantages that are useful here:divis prime, since it can’t be composite because any prime factors smaller than it would already have been divided out.You could then also break once
div*divis greater than the remaining number, as you know at that point that it must be a prime. This is because any divisors greater than the square root are “paired” with one less than the square root. However, since this is an “easy” problem, this optimization is not needed here (although it is useful for later problems).