蓝桥杯算法提高VIP-特殊的质数肋骨使用递归不用dfs解题

原题链接:蓝桥杯算法提高VIP-特殊的质数肋骨 - C语言网 (dotcpp.com)

解题思路:

  1. 定义了一个辅助函数 isPrime,用于判断一个数是否为质数。函数中使用了经典的质数判断方法,通过遍历从 2 到该数平方根的所有数字,检查是否有能整除该数的因子。如果存在能整除的因子,则该数不是质数,否则是质数。

    bool isPrime(int num) {
        if (num < 2) {
            return false;
        }
        for (int i = 2; i <= sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }

     

  2. 定义了一个递归函数 generateSpecialPrimes,用于生成长度为 N 的特殊质数。该函数接受两个参数:N 表示要生成的特殊质数的长度,prefix 表示当前已经生成的数字序列。
    void generateSpecialPrimes(int N, string prefix) {
        if (prefix.length() == N) {
            cout << prefix << endl;
            return;
        }
        for (int digit = 1; digit <= 9; digit++) {
            int nextNum = stoi(prefix + to_string(digit));
            if (isPrime(nextNum)) {
                generateSpecialPrimes(N, prefix + to_string(digit));
            }
        }
    }

    generateSpecialPrimes 函数中,首先检查当前数字序列的长度是否等于 N。如果等于 N,则表示已经生成了长度为 N 的特殊质数,将其输出并返回。如果当前数字序列长度不足 N,则通过一个循环从 1 到 9 遍历每个数字,依次尝试将其添加到当前数字序列的末尾。具体做法是将数字转换为字符串,然后使用 prefix + to_string(digit) 将其连接到当前数字序列的末尾。对于每个新生成的数字序列,使用 stoi 函数将其转换为整数类型,然后调用 isPrime 函数判断该数是否为质数。如果是质数,则递归调用 generateSpecialPrimes 函数,将新的数字序列作为 prefix 传递进去,继续生成下一位数字。通过递归调用,不断尝试在当前数字序列后面添加 1 到 9 的数字,并判断生成的数是否为质数,直到生成的数字序列长度达到 N。

  3. 完整代码:

    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;
    
    bool isPrime(int num) {
        if (num < 2) {
            return false;
        }
        for (int i = 2; i <= sqrt(num); i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
    
    void generateSpecialPrimes(int N, string prefix) {
        if (prefix.length() == N) {
            cout << prefix << endl;
            return;
        }
        for (int digit = 1; digit <= 9; digit++) {
            int nextNum = stoi(prefix + to_string(digit));
            if (isPrime(nextNum)) {
                generateSpecialPrimes(N, prefix + to_string(digit));
            }
        }
    }
    
    int main() {
        int N;
        cin >> N;
    
        generateSpecialPrimes(N, "");
    
        return 0;
    }

     

posted @ 2023-07-02 17:48  fognight  阅读(43)  评论(0)    收藏  举报