Project Euler Problem 118 Pandigital prime sets

Pandigital prime sets

Problem 118

Using all of the digits 1 through 9 and concatenating them freely to form decimal integers, different sets can be formed. Interestingly with the set {2,5,47,89,631}, all of the elements belonging to it are prime.

How many distinct sets containing each of the digits one through nine exactly once contain only prime elements?


C++:

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

const int N = 9;

int val[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
long ans;

bool isprime(long n)
{
    if(n == 1)
        return false;

    if(n == 2)
        return true;

    if(n % 2 == 0)
        return false;

    long end = sqrt(n);
    for(long i=3; i<=end; i+=2)
        if(n % i == 0)
            return false;

    return true;
}

void primeset(int pos, long long leftval)
{
    if(pos >= N) {
        ans++;
        return;
    }

    long long value = 0;
    while(pos < N) {
        value *= 10;
        value += val[pos++];

        if(isprime(value) && value >= leftval)
            primeset(pos, value);
    }
}

int main()
{
    ans = 0;
    for(;;) {
        primeset(0, 0);

        if(!next_permutation(val, val + N))
            break;
    }

    cout << ans << endl;

    return 0;
}



posted on 2017-03-30 18:52  海岛Blog  阅读(360)  评论(0编辑  收藏  举报

导航