NUC1214 回文素数

回文素数

时间限制: 1000ms 内存限制: 65536KB

问题描述

151 是一个回文素数,因为它既是一个素数又是回文数(回文数是指一个数 从左到右 和 从右到左 读的结果一样).

试写一个程序计算区间 [ a , b ] 内的所有回文素数.( 5 <= a < b <= 100,000,000 )

输入描述
只有一组测试数据: a b
输出描述
输出[a,b]区间内所有回文素数,每个数占一行
样例输入
5 500
样例输出
5
7
11
101
131
151
181
191
313
353
373
383


问题分析:

这个题与HDU1431是同一个题,程序直接拿过来用就可以了。

程序说明:

参见链接博文。


参考链接:HDU1431 素数回文


AC的C++程序如下:

/* 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;  
} 


posted on 2017-04-29 11:14  海岛Blog  阅读(415)  评论(0编辑  收藏  举报

导航