超级素数(sprime)
题目描述
超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如:
373->37->3
这是一个长为3的超级素数。
输入
输入一个整数n (10≤n≤108)。
输出
从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格。末尾也有一个空格
样例输入
10
样例输出
2 3 5 7
仔细一想, 第一位肯定是2, 3, 5 ,7 这四个素数, 然后继续添加, 只能添加1, 3, 7, 9 为啥,,自己想, 判断为素数后,继续添加1, 3 ,7 , 9, 如此循环。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <algorithm> #include <climits> using namespace std; const int maxn = 10010; const int INF = 0x3f3f3f3f; int a[maxn]; int n; int ans = 4; int cnt = 0, m; void bfs(int n) { int flag = 1; for(int i = 2; i * i <= n; i++) { if(n % i == 0) { flag = 0; break; } } if(flag) { a[cnt++] = n; if(n*10 + 3 <= m) { bfs(n*10+3); } if(n*10 + 1 <= m) { bfs(n*10+1); } if(n*10 + 7 <= m) { bfs(n*10+7); } if(n*10 + 9 <= m) { bfs(n*10+9); } } } int main() { scanf("%d", &m); if(m >= 2) bfs(2); if(m >= 3) bfs(3); if(m >= 5) bfs(5); if(m >= 7) bfs(7); sort(a, a+cnt); for(int i = 0; i < cnt; i++){ printf("%d ", a[i]); } printf(" "); return 0; }