프로젝트 오일러 27
단순하게 푼 euler 27번. 그냥 -999 ~ 999 의 a/b에 대해 모든 경우의 수를 구해서 풀었다. 소수를 저장해두면 그나마 빠르게 풀 수 있다. 실행시간은 8초정도 걸린다.
/*
Problem 27 : Quadratic primes
*/
#include <iostream>
#include <cmath>
#include <cstring>
#include <stdio.h>
#include <string.h>
#include <ctime>
#include <math.h>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
std::map<int, int> primes;
//primes.insert( map<int, int>::value_type(2,2));
//primes.insert( std::pair<int,int>(2,2));
bool isprime( int n)
{
map<int,int>::iterator it = primes.find(n);
if( it != primes.end()) {
return true;
}
if (n == 2){
primes.insert( map<int,int>::value_type(n,n));
return true;
}
// else calculate
for(int i=2; i<= sqrt(n); i++)
{
if (n%i ==0){
return false;
}
}
primes.insert( map<int,int>::value_type(n,n));
return true;
}
int consecutive_primes( int a, int b)
{
cout << "a=" << a << ",b="<<b <<endl;
// n^2 + a*n + b
int max = 0;
for(int n=0;;n++)
{
int q = n*n + a*n + b;
if (q <= 1) break;
if (!isprime(q)) break;
//cout << "\tconsecutive prime n=" << n<< endl;
max++;
}
return max;
}
int main(int argc, char** argv)
{
clock_t begin = clock();
int max = 0;
int a;
int b;
for(int ai=-999; ai< 1000; ai++)
{
for( int bj= -999; bj<1000; bj++)
{
int n = consecutive_primes(ai, bj);
if (n > max) {
max = n;
a = ai;
b = bj;
}
}
}
clock_t end = clock();
std::cout << "a=" << a << " ,b=" << b << " ,max number of consecutive primes=" << max << std::endl;
std::cout << "elapsed time=" << double(end - begin) / CLOCKS_PER_SEC << std::endl;
return 0;
}