HDU1431 素数回文

问题链接:HDU1431

看似比较简单的问题,实际上需要一个过程来解决,否则不是时间出问题,就是空间出问题。

首先,需要编写一个程序,计算1到100000000之间的回文素数,得到两个值。一是这个区间的最大回文素数是9981899,二是这个区间的回文素数个数是780个。

因此,在定义数组空间时,就可以取一个合适的数值,避免空间超出限制范围。同时可以节省存储空间,加快程序运行速度。

另外,使用布尔数组作为素数筛选标志也可以大量节省存储。

算法策略上,先行筛选素数再判定是否是回文数,时间上比较好一点,逻辑上也比较顺。

程序如下:

/* HDU1431 HIT1004 回文素数 */

#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;

#define MAXN 9989899

bool isprime[MAXN+1];
int prime[800];
int count;

// 函数功能:判断n是否为回文数
// 参数n:需要判断是否为回文数的数
bool isPalindrome(int n)
{
    int temp1 = n, temp2 = 0;

    while(n > 0) {
        temp2 = temp2 * 10 + n % 10;
        n /= 10;
    }

    return temp1 == temp2;
}

// Eratosthenes筛选法,包含回文数判断
void sieveofe(bool isprime[], int prime[], int n, int &count)
{
    int i, j;

    count = 0;
    isprime[0] = false;
    isprime[1] = false;
    isprime[2] = true;

    // 初始化
    for(i=3; i<=n; i++) {
        isprime[i++] = true;
        isprime[i] = false;
    }
    int max = sqrt(n);
    for(i=3; i<=max; i++){
        if(isprime[i]) {
            for(j=i+i; j < n; j+=i)    //进行筛选
                isprime[j] = false;
        }
    }

    // 将回文素数放数组prime中,在这里判断是否是回文数
    prime[0] = 2;
    j = 1;
    for(i=3; i<=n; i+=2)
        if(isprime[i] && isPalindrome(i))
            prime[j++] = i;

    count = j;
}

int main()
{
    sieveofe(isprime, prime, MAXN, count);

    int a, b;

    while(~scanf("%d%d",&a,&b)) {
        for(int i=1; i<count; i++) {
            if(prime[i] < a)
                continue;
            if(prime[i] > b)
                break;
            printf("%d\n", prime[i]);
        }
        printf("\n");
    }

    return 0;
}

时间: 2024-08-03 20:48:03

HDU1431 素数回文的相关文章

hdu1431素数回文

Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数.(5 <= a < b <= 100,000,000); Input 这里有许多组数据,每组包括两组数据a跟b. Output 对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行. Sample Input 5 500

HDU1431 素数回文 【暴力】

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

05:素数回文数的个数

描述 求11到n之间(包括n),既是素数又是回文数的整数有多少个. 输入 一个大于11小于1000的整数n.输出11到n之间的素数回文数个数. 样例输入 23 样例输出 1 提示回文数指左右对称的数,如:292,333. 来源 06计算概论课 代码 1 略 2 using namespace std; 3 bool sunum(int a) 4 { 5 for(int i=2;i<=sqrt(a);i++) 6 { 7 if(a%i==0) return 0; 8 } 9 return 1; 1

素数回文

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

12--c完数/最大公约数/最小公倍数/素数/回文数

完数/最大公约数/最小公倍数/素数/回文数 2015-04-08 10:33 296人阅读 评论(0) 收藏 举报  分类: C/C++(60)  哈尔滨工业大学(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 1.一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). [cpp] view plain copy #include <stdio.h> #include <math.h

F题 hdu 1431 素数回文

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1431 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15041    Accepted Submission(s): 3359 Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151

hdu 1431 素数回文(暴力打表,埃托色尼筛法)

这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表,筛素数肯定用埃托色尼筛法(不好意思把大名鼎鼎的埃拉托色尼名字打错了,表打我). 再看当你所找的回文数的位数为偶数时,有如下定理除11外所有偶数位数的回文数都能被11整除,所以所有偶数位数的回文都不是素数. 证明看如下(我手写的) 手机像素渣(凑活着吧)字丑也凑和着. 证完后我们在来说题目给的数据范围 所以当

poj2928:素数回文数的个数

总时间限制: 1000ms 内存限制: 65536kB 描述 判断11到任何一个小于1000大于11的整数之间,既是素数又是回文数的整数的个数. 输入 输入大于11小于1000的整数. 输出 11到输入的这个数之间的既是素数又是回文数的个数. 样例输入 999 543 样例输出 16 10 提示 测试数据有多组,用while()循环输入. 回文数即为左右对称的数,如:292,333. 本题数据规模不大,可以直接先把素数标记出来再进行判断. 代码如下 #include <iostream> #i

HDU 1431 素数回文【暴力求解】

/* 题目大意:找一个范围内的所有素数回文数 解题思路:打一个表将1亿以内所有的素数回文数找出来,大概有780个这样子 关键点:暴力求解 解题人:lingnichong 解题时间:2014-08-29 12:02:55 解题体会:如果按一般方法打个素数表,很容易超内存(MLE),所以就先将所有的素数回文全部算出来,再在这个数组里面找在题上那个范围的所有素数回文数 */ 素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 655