/* ID: m1590291 TASK: sprime LANG: C++ */ #include <iostream> #include <fstream> using namespace std; /****************************************************************************************************************** 第一次感到 DFS 是如此的好用和方便 思路: (从数学的角度) 1.首位只能是质数2 3 5 7 2.其余位只能是1,3,7,9 3.若n=1,直接输出2,3,5 7 4. DFS 不需要预处理。 直接DFS 1~9,加入当前数末尾,并判断是不是素数, 是则递归处理下一位数,不是则回溯,直到depth>n。不会超时。 ******************************************************************************************************************/ ifstream fin("sprime.in"); ofstream fout("sprime.out"); int N; int fuc(int x) { for(int i = 2;i*i <= x;i ++) if(x%i == 0) return 0; return 1; } void dfs(int x,int num) { if(!fuc(x)) return ; //不是质数,进行回溯 if(num == N) fout<<x<<endl; //边界条件,长度 num == N; else{ for(int i = 1;i <=9;i +=2) dfs(x*10+i,num+1); } } int main() { while(fin>>N) { int a[4]={2,3,5,7}; for(int i = 0;i < 4;i ++){ dfs(a[i],1); } } return 0; }