miércoles, 11 de abril de 2012

Project Euler 46

#include <iostream>
#include <cmath>
#define LIM 10000
using namespace std;
int primos[5000]={0};
bool criba[LIM+1]={false};
int cantPrimos = 1;
void generarCriba(){
    int i,j;
    double raiz = sqrt(LIM);
    for(i = 4 ; i<=LIM ;i+=2)
        criba[i] = true;
    for(i = 3 ; i<=raiz;i+=2)
        if(!criba[i])
            for(j = i+i ; j<=LIM ; j+=i)
                criba[j] = true;
    primos[0] = 2;

    for(i = 3; i<=LIM;i+=2)
        if(!criba[i])
            primos[cantPrimos++] = i;
}
bool sePuedeEscribir(int n){
    if(!criba[n])
        return true;
    int i;
    for(i = 0; i<cantPrimos && primos[i]+2 <= n; i++){
        int p = 1;
        int var;
        while((var=(primos[i]+(2*p*p)))<=n){
            if(var==n)
                return true;
            p++;
        }
    }
    return false;
}
int main()
{
    generarCriba();
    int n = 33;
    while(true){
        if(!sePuedeEscribir(n)){
            cout << n<< endl ; return 0;
        }
            n+=2;
    }
    return 0;
}

No hay comentarios:

Publicar un comentario