超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数总为质数,例如373->37->3,233->23->2,这两个都是长为3的超级素数。
输入
输入一个整数n (10≤n≤1000000000)。
输出
从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格。
样例组
样例1 输入 10 输出 2 3 5 7 样例2 输入 100 输出 2 3 5 7 23 29 31 37 53 59 71 73 79
题目思路
这道题由于数据范围比较大,用普通的判素数函数+单循环判断绝对是不行的,用埃式筛也是不可以的(数组开不到这么大)。同时,这种题目也不像可以用各种朴素算法通过的题目。因此,我们可以借助STL中的队列(queue)来解决这道题目。
我们可以先开一个数组(或STL里的vector<>)储存最后的答案,再开一个队列,将2,3,5,7四个素数弹入队列,然后判断q.front是否大于输入的值,如果大于,弹出;否则将q.front存入数组,同时开一个变量T储存q.front,并将其弹出队列。紧接着,我们可以用一层for循环循环1-9的奇数,看T在末尾加上那个奇数后是否是质数。如果是,将加上那个奇数后的T弹入队列。至于怎么判质数?用洛谷筛(O(sqrt(n))还是能过的。
最后,可以用到宽搜+队列的切出条件while(!q.empty())来判断是否跳出while循环。最后输出数组即可。
这道题的主程序如下:
queueq;vector a;int x; int cx() { q.push(2);q.push(3);q.push(5);q.push(7); while(!q.empty()) { int t=q.front(); if(t>x) break; a.push_back(t);q.pop(); for(int i=1;i<=9;i+=2) if(pzs(t*10+i)) q.push(t*10+i); } }
题目标程
这道题目的标程如下:
#includeusing namespace std; queue q;vector a;int x; bool pzs(int n) { if(n<2) return 0; for(int i=2;i*i<=n;i++) if(n%i==0) return 0; return 1; } int main() { cin>>x; q.push(2);q.push(3);q.push(5);q.push(7); while(!q.empty()) { int t=q.front(); if(t>x) break; a.push_back(t);q.pop(); for(int i=1;i<=9;i+=2) if(pzs(t*10+i)) q.push(t*10+i); } for(int i=0;i
这道题目就这么多。(似乎也不是特别难)
暑期编程PK赛 得CSDN机械键盘等精美礼品!


