蓝桥杯算法提高VIP-特殊的质数肋骨使用递归不用dfs解题
原题链接:蓝桥杯算法提高VIP-特殊的质数肋骨 - C语言网 (dotcpp.com)
解题思路:
-
定义了一个辅助函数
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; }
- 定义了一个递归函数
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。 -
完整代码:
#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; }

浙公网安备 33010602011771号