超级质数

题目描述

一个质数如果从个位开始,依次去掉一位数字,两位数字,三位数字。。。。。。直到只剩一位数字中间所有剩下的数都是质数,则称该质数为一个超级质数。例如:2333是一个质数,因为2333,233,23,2都是质数,所以2333是一个四位超级素数。请你写一个程序,给定一个整数X,求大小小于X的超级质数。

输入输出格式

输入格式:

一行,给出一个整数X(1<=X<=100000000).

输出格式:

第一行,一个整数k,表示X以内超级质数的个数.

第2至k+1行,每行一个整数,输出所有X以内的超级质数,这些数按从小到大的顺序排列。

输入输出样例

输入样例#1:

100

输出样例#1:

13
2
3
5
7
23
29
31
37
53
59
71
73
79

说明

对于30%的数据,X<=1000。

对于100%的数据,X<=100000000。

本题可采用队列思想。首先将0放入队列中,接下来不断从队列中取出一个超级质数(或者是0)在其末尾添加0到9的数字后判断新数是否为超级质数,是就入队。最后在所有入过队的数中,输出X以内的数。还可以保证输出是有序的。

#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;
int q[100],head=0,tail=1,cnt;
int isprime(int x)
{
    if(x<2) return 0;
    int i;
    for(i=2;i*i<=x;i++)
    {
        if(x%i==0) return 0;
    }
    return 1;
}
int main()
{
    int a,i,x;
    scanf("%d\n",&x);
    q[head]=0;
    while(head<tail)
    {
        a=q[head];
        if(a>100000000) break;
        for(int i=1;i<=9;i++)
        {
            if(isprime(a*10+i))
            {
                q[tail++]=a*10+i;
            }
        }
        head++;
    }
    for(i=1;i<tail;i++)
    {
        if(q[i]<x) cnt++;
    }
    printf("%d\n",cnt);
    for(i=1;i<=cnt;i++)
    {
        printf("%d\n",q[i]);
    }
    return 0;
}
时间: 2024-10-23 02:59:47

超级质数的相关文章

洛谷P2667 超级质数 [2017年6月计划 数论05]

P2667 超级质数 题目背景 背景就是描述,描述就是背景...... 题目描述 一个质数如果从个位开始,依次去掉一位数字,两位数字,三位数字......直到只剩一位数字中间所有剩下的数都是质数,则称该质数为一个超级质数.例如:2333是一个质数,因为2333,233,23,2都是质数,所以2333是一个四位超级素数.请你写一个程序,给定一个整数X,求大小小于X的超级质数. 输入输出格式 输入格式: 一行,给出一个整数X(1<=X<=100000000). 输出格式: 第一行,一个整数k,表示

sgu100~199题解

老东西了..发上来吧.. Sgu题解系列  南开中学邹事成 100:A+B略 101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样. 可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可. 102:Coprimes给定n求从1到n中与n互质的数的个数. 可以把n质因数分解后直接代入欧拉函数.

超级素数(sprime) (BFS)

问题 G: 超级素数(sprime) 时间限制: 1 Sec  内存限制: 64 MB提交: 47  解决: 11[提交][状态][讨论版] 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如: 373->37->3 这是一个长为3的超级素数. 输入 输入一个整数n (10≤n≤108). 输出 从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格.末尾也有一个空格 样例输入 10 样例输出 2 3 5 7 [分析]通过找规律,发现所求素数中只可能出现

超级素数(sprime)

超级素数(sprime) 题目描述 超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数为质数,例如:373->37->3这是一个长为3的超级素数. 输入 输入一个整数n (10≤n≤108). 输出 从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格.末尾也有一个空格 样例输入 10 样例输出 2 3 5 7 分析:素数生成,第一位是2,3,5,7,以后的可以加1,3,7,9:代码: #include <iostream> #include <cstdi

java算法之超级丑数

问题描述: 写一个程序来找第 n 个超级丑数. 超级丑数的定义是正整数并且所有的质数因子都在所给定的一个大小为 k 的质数集合内. 比如给你 4 个质数的集合 [2, 7, 13, 19], 那么 [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] 是前 12 个超级丑数. 注意事项 1:永远都是超级丑数不管给的质数集合是什么. 2:给你的质数集合已经按照升序排列. 0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] &l

超级素数

超级素数 程序名:super.cpp super.in super.out 题目描述: 一个素数,依次从低位去掉一位,二位,……,若所得的各数仍都是素数,则称超级素数. 例如:7331是个4位超级素数,因为7,73,733,7331均为素数. 试求n位数的超级素数: (1)超级素数的个数 (2)所有超级素数之和 (3)最大的超级素数. 输入描述: 输入一个整数n(n<=10) 输出描述: 输出三个整数,分别为超级素数的个数,所有超级素数之和,最大的超级素数:  无解输出-1 样式输入: 4 样式

超级丑数--用查找的api解决

class Ugly { constructor(n, primes) { this.n = n this.primes = primes } getAll() { // 超级丑数列表 let res = [1] let i = 2 let primes = this.primes // 不知道上限用while循环 while (res.length < this.n) { let arr = Ugly.getPrimies(i) let k = 0 let l = arr.length for

C#中质数的两种算法

一.判断1到该数本身一共能被多少数整除,若只能被两个数整除,则该数为质数. int n = 0; for(int i = 1; i < = num; i++){ //遍历1-num的所有整数与num相除,得出num能被多少个数整除 if(num%i==0){ n++; } } if(n == 2){ //只能被两个数整除,则num为质数 //num是质数 } else{ //num不是质数 } 二.判断该数除1和本身,是否能被其他数整除,若不能,则该数为质数. bool s = false; f

超级搬运工

前我们往屏幕输出了一个Hello,费了老大的劲.有没有什么更简单的方法呢?当然有啦. 我们把所有的文字对应的Ascll码统一放到一块内存里面.再把这些东西统一搬进去显存里面. mov cx,10ES:B800DI:0 DS:07C0SI:8 rep movsb byte ptr [ES:DI],byte ptr [DS:SI] 超级搬运工:1.要搬的东西的在哪里.2.把东西搬到哪里去.3.每一次可以搬多少东西,需要搬多少次.4.从上往下搬,还是从下往上搬. movsb  32位  16位 8位寄