机考题库028素数伴侣

#include 
#include 
#include 

#define NUM_MAX 100
int odds[NUM_MAX] = {0};
int evens[NUM_MAX] = {0};
int oddCount = 0;
int evenCount = 0;
bool primePar[NUM_MAX][NUM_MAX] = {0};
bool visited[NUM_MAX] = {false};
int match[NUM_MAX] = {0}; // 统计每个偶数配对的是哪个奇数

// 判断素数
bool isPrime(int num)
{
    if (num <= 1) {
        return false;
    }
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

// 
bool dfs(int num, int *evens, bool *visited, int *match) 
{
    for (int i = 0; i < evenCount; ++i) {
        if (isPrime(num + evens[i]) && !visited[i]) {
            visited[i] = true;
            if (match[i] == 0 || dfs(match[i], evens, visited, match)) {
                match[i] = num;
                return true;
            }
        }
    }
    return false;
}

int main()
{
    // 1 输入一个正偶数 n,1≤n≤100
    int n = 0;
    scanf("%d", &n);
    // 2 输入 n 个整数, 2≤val≤30000
    int val[n];
    for (int i = 0; i < n; ++i) {
        scanf("%d", &val[i]);
        if (val[i] % 2) {
            odds[oddCount++] = val[i];
        } else {
            evens[evenCount++] = val[i];
        }
    }
    int count = 0; // 记录素数伴侣对数
    // 如果没有奇数或者偶数就不会有素数伴侣
    if (oddCount == 0 || evenCount == 0) {
        printf("%d\n", 0);
        return 0;
    }
    // 遍历素数伴侣
    for (int i = 0; i < oddCount; ++i) {
        for (int j = 0; j < evenCount; ++j) {
            if (isPrime(odds[i] + evens[j])) {
                primePar[i][j] = 1;
            }
        }
    }
    // 遍历每一个奇数
    for (int i = 0; i < oddCount; ++i) {
        // 清空偶数访问记录,每一轮都可以重新开始访问偶数
        memset(visited, false, sizeof(visited));
        // 能否找到最优的配对偶数
        if (dfs(odds[i], evens, visited, match)) {
            count++;
        }
    }
    printf("%d", count);

    return 0;
}

你可能感兴趣的:(机考刷题00,算法,数据结构)