一亿以内的回文素数

题意分析:求给定区间内的质数回文数
题目分析:
1.多组测试数据,所以先打表。
2.先求质数再判断回文,效率低下;所以先构造回文数,再判断质数。
3.偶数位的回文数都能被11整除,自己证明去。所以,偶数位的回文数除了11都是合数。
4.一个k位数,可以构造出一个奇数位的回文数。比如13,可以构造131;189可以构造18981.所以100000000内的只要从1构造到9999即可。
5.若范围为1000000000,那么明显超出int范围,要用long long。当然此题无此陷阱。
6. 最后按从小到大的顺序输出,优先队列搞定。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <vector>
#define MAXN 10000
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

typedef long long LL;

struct cmp
{
    bool operator()(const int &a, const int &b)
    {
        return a > b;
    }
};

priority_queue <int, vector<int>, cmp> pq;

bool is_prime(int x)
{
    for(int i=2; i<sqrt(x+0.5); i++) {
        if(x % i == 0) return false;
    }
    return true;
}

int main()
{
    //freopen("data.in", "r", stdin);
    //freopen("data.out", "w", stdout);
    while(!pq.empty()) pq.pop();
    pq.push(11);
    int sum, tmp;
    for(int i=2; i<MAXN; i++) {
        for(sum=i, tmp=i/10; tmp!=0; tmp/=10) {
            sum = sum*10 + tmp%10;
        }
        if(is_prime(sum)) pq.push(sum);
    }
    while(!pq.empty()) {
        cout << pq.top() << endl;
        pq.pop();
    }
    return 0;
}

版权声明:感觉我写的还算不错的的话希望你能够动动你的鼠标和键盘为我点上一个赞或是为我奉献上一个评论,在下感激不尽!_______________________________________________________欢迎转载,希望在你转载的同时,添加原文地址,谢谢配合

时间: 2024-08-10 15:11:29

一亿以内的回文素数的相关文章

Codeforces Round #315 -Primes or Palindromes?(回文&amp;&amp;素数)

题目地址:Primes or Palindromes? 题意:给出p,q,A=p/q,求找出最大的n使得n以内的素数的个数<=A*n以内的回文串的个数. 思路:其实就是n以内的素数的个数*q<=n以内的回文串的个数*p.然而p/q的最大值为42,那么数到13000000就到达极限,所以我们直接可以从大的开始往小的一步一步的暴力枚举就可以(感觉窝还是太年轻..QAQ #include <stdio.h> #include <math.h> #include <str

C++刷题——2704: 回文素数

2704: 回文素数 /* Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作者:陈丹妮 * 完成日期:2015年 5 月 26 日 * 版 本 号:v1.0 */ Description 输入一个数n,输出n以内所有的回文素数.回文素数,即既是素数,又是回文数,从前往后.从后往前看一个样.例373. Input 大于10的正整数n Output n以内所有的回文素数 Sample Input 500

11周(回文+ 素数)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:测试控制符号 *作者:王忠 *完成日期:2014.10.30 *版本号:v1.0 * *问题描述:输出1000以内既是回文数又是素数的数 *输入描述: *程序输出:输出1000以内既是回文数又是素数的数 #include <iostream> using namespace std; bool isPalindrome(int); bool isPrimer(int); in

判断一个数字是否是回文数字,如果是则打印出100以内的回文数字,若不是只给出提示信息。

回文数字指的是什么呢?什么是回文数字呢? 回文数字的特征是:一组数字,从左读和从右读都是一样的,比如:123.123321.12345654321 public class HuiWenTest{    public static void main(String[] args)    {        Scanner sc = new Scanner(System.in); try        {            System.out.println("请输入你要判断的数字: &quo

算法15---数论6---素数,回文素数 分解质因素

算法15---数论6---素数,回文素数  分解质因素 1 /* 2 题目:素数,回文素数 3 author taoliu——alex 2016.10 number4 4 5 主要实现: 6 判断素数,判断回文素数 7 */ 8 9 10 11 #include <stdio.h> 12 #include <math.h> 13 14 15 16 //素数 17 18 19 int isprime(int a) 20 { 21 for (int i = 2; i < a; i

poj3247:回文素数

总时间限制: 5000ms 内存限制: 65536kB 描述 一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数.给定位数n,找出所有既是回文数又是素数的n位十进制数.(注:不考虑超过整型数范围的情况). 输入 位数n,其中1<=n<=9. 输出 第一行输出满足条件的素数个数. 第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分. 样例输入 1 样例输出 4 2 3 5 7 这道题挺简单的,本来自己是肯定能够想到平方

HDU 1431 素数回文(回文素数)

http://acm.hdu.edu.cn/showproblem.php?pid=1431 题意: 给你两个整数a,b.(5 <= a < b <= 100,000,000)要你按顺序输出[a,b]区间内的所有回文素数. 分析: 定理:如果一个数是回文且有偶数位,那么它能被11整除. 根据上面定理我们可知我们只需要找到区间[2,1000W)内的素数即可.(想想为什么)上面b的范围直接缩小了10倍. 剩下的工作就是用筛选法求出1000W内的所有素数,然后对于给定的a和b,我们对于[a,b

HDU 1431 素数回文(打表+技巧,最大回文素数为9989899!!!)

素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17512    Accepted Submission(s): 4033 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a

回文素数-2015校内选拔第三题

10301是个5位的素数.它有个特点,把数字倒过来还是它本身,具有这样特征的素数,我们称之为:回文素数. 105011060111311 这些都是5位的回文素数. 请你计算一下,像这样的5位数的回文素数,一共有多少个? 请填写这个表示个数的整数,注意不要写任何其它多余的内容,比如说明或解释文字,也不要列出所有的回文素数. 原文地址:https://www.cnblogs.com/jinyufanfan/p/10105434.html