Project Euler Problem 47 Distinct primes factors

Distinct primes factors

Problem 47

The first two consecutive numbers to have two distinct prime factors are:

14 = 2 × 7
15 = 3 × 5

The first three consecutive numbers to have three distinct prime factors are:

644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19.

Find the first four consecutive integers to have four distinct prime factors each. What is the first of these numbers?


C++(Faster):

#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>

using namespace std;

const int MAXN = 4000;
const int N = 1000000;

int prime[MAXN+2] = {2, 3, 5};

bool isprime(int n)
{
    int q=sqrt(n), i=1;

    while(prime[i] <= q)
        if(n % prime[i] == 0)
            return false;
        else
            i++;

    return true;
}

void maketable(int n)
{
    int val1 = 1, val5 = 5;

    for(int i=3; i<=n;) {
        val1 += 6;
        if(isprime(val1))
            prime[i++] = val1;

        val5 += 6;
        if(isprime(val5))
            prime[i++] = val5;
    }
}

int factorcount[N+1];

void setval(int start, int k, int count)
{
    for(int i=start; i<=N; i*=k) {
        if(i < 0)
            break;
        factorcount[i] = count;
    }
}

int next(int start)
{
    for(;;) {
        while(factorcount[start])
            start++;

        if(factorcount[start+1] == 0 && factorcount[start+2] == 0 && factorcount[start+3] == 0)
            break;

        while(factorcount[start] == 0)
            start++;
    }

    return start;
}

int fact(int n, int fact[])
{
    int i=0, j=0;
    while(n > 1) {
        if(i > MAXN) {
            fact[j++] = n;
            break;
        }
        while(n % prime[i] == 0) {
            fact[j] = prime[i];
            n /= prime[i];
        }
        if(fact[j])
            j++;
        i++;
    }
    return j;
}

int main()
{
    vector<int> v;
    int factor[64];

    maketable(MAXN);

    memset(factorcount, 0, sizeof(factorcount));

    for(int i=0; i<=MAXN; i++)
        setval(prime[i], prime[i], 1);

    int i = 2, count;
    i = next(i);
    for(; i<N-4;) {
        memset(factor, 0, sizeof(factor));

        count = fact(i, factor);
        if(count != 4) {
            for(int j=0; j<count; j++)
                setval(i, factor[j], count);
            i = next(i + 1);
        } else {
            v.push_back(i++);
            if(v.size() >= 4) {
                if(v[0]+1 == v[1] && v[1]+1 == v[2] && v[2]+1 == v[3]) {
                    cout << v[0] << endl;
                    break;
                } else
                    v.erase(v.begin());
            }
        }
    }

    return 0;
}

C++:
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>

using namespace std;

const int MAXN = 4000;
const int N = 1000000;

int prime[MAXN+2] = {2, 3, 5};

bool isprime(int n)
{
    int q=sqrt(n), i=1;

    while(prime[i] <= q)
        if(n % prime[i] == 0)
            return false;
        else
            i++;

    return true;
}

void maketable(int n)
{
    int val1 = 1, val5 = 5;

    for(int i=3; i<=n;) {
        val1 += 6;
        if(isprime(val1))
            prime[i++] = val1;

        val5 += 6;
        if(isprime(val5))
            prime[i++] = val5;
    }
}

int fact(int n)
{
    int i=0, j=0;
    while(n > 1) {
        if(i > MAXN) {
            j = 1;
            break;
        }
        if(n % prime[i] == 0) {
            j++;
            while(n % prime[i] == 0)
                n /= prime[i];
        }
        i++;
    }
    return j;
}

int main()
{
    vector<int> v;

    maketable(MAXN);

    for(int i=1; i<=N; i++) {
        if(fact(i) == 4) {
            v.push_back(i);
            if(v.size() >= 4) {
                if(v[0]+1 == v[1] && v[1]+1 == v[2] && v[2]+1 == v[3]) {
                    cout << v[0] << endl;
                    break;
                } else
                    v.erase(v.begin());
            }
        }
    }

    return 0;
}



posted on 2017-03-22 18:20  海岛Blog  阅读(182)  评论(0编辑  收藏  举报

导航