回文质数

来源:互联网 发布:php微信分享接口开发 编辑:程序博客网 时间:2024/06/08 07:33

描述:

因为151既是一个质数又是一个回文数(从左到右和从右到左看是一样的),所以151是回文质数.
写一个程序来找出范围[a,b](1<=a<b<=100,000,000)间的所有回文质数.

输入:

第一行 两个整数:a和b.

输出:

输出一个回文质数的列表,一行一个.

输入样例:

5 500

输出样例:

5711101131151181191313353373383

#include <iostream>#include <math.h>
using namespace std;
int cnt;            //5到100000000之间回文质数的个数int a, b;int H[100000];      //5到100000000之间的回文质数int isprime(int m);
void hw12();        //生成1,2位数的回文质数void hw3();         //生成3位数的回文质数void hw5();         //生成5位数的回文质数void hw7();         //生成7位数的回文质数void output();      //输出a到b之间的回文质数
int main(){    /*    [a,b](5<=a<b<=100,000,000)间的所有回文质数
    两个整数:a和b.
    输出一个回文质数的列表,一行一个    */    cin >> a >> b;
    hw12();    hw3();    hw5();    hw7();    output();    return 0;}
int isprime(int m){    int i; for(i = 2; i <= sqrt(m); i ++)    {        if(! (m % i))            return 0;    } return 1;}
void hw12(){    H[0] = 2;    H[1] = 3;    H[2] = 5;    H[3] = 7;    H[4] = 11;    cnt = 5;}void hw3(){    int i;    int j;    int h;                  //回文数    i = cnt;    for(j = 10; j <= 19; j ++)    {        h = j * 10 + ((j / 10) % 10);        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 30; j <= 39; j ++)    {        h = j * 10 + ((j / 10) % 10);        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 70; j <= 79; j ++)    {        h = j * 10 + ((j / 10) % 10);        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 90; j <= 99; j ++)    {        h = j * 10 + ((j / 10) % 10);        if(isprime(h))        {            H[i] = h;            i ++;        }    }    cnt = i;}void hw5(){    int i;    int j;    int h;                  //回文数    i = cnt;    for(j = 100; j <= 199; j ++)    {        h = j * 100 + ((j / 10) % 10) * 10 + (j / 100) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 300; j <= 399; j ++)    {        h = j * 100 + ((j / 10) % 10) * 10 + (j / 100) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 700; j <= 799; j ++)    {        h = j * 100 + ((j / 10) % 10) * 10 + (j / 100) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 900; j <= 999; j ++)    {        h = j * 100 + ((j / 10) % 10) * 10 + (j / 100) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    cnt = i;}void hw7(){    int i;    int j;    int h;                  //回文数    i = cnt;    for(j = 1000; j <= 1999; j ++)    {        h = j * 1000 + ((j / 10) % 10) * 100 + ((j / 100) % 10) * 10 + (j / 1000) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 3000; j <= 3999; j ++)    {        h = j * 1000 + ((j / 10) % 10) * 100 + ((j / 100) % 10) * 10 + (j / 1000) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 7000; j <= 7999; j ++)    {        h = j * 1000 + ((j / 10) % 10) * 100 + ((j / 100) % 10) * 10 + (j / 1000) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    for(j = 9000; j <= 9999; j ++)    {        h = j * 1000 + ((j / 10) % 10) * 100 + ((j / 100) % 10) * 10 + (j / 1000) % 10;        if(isprime(h))        {            H[i] = h;            i ++;        }    }    cnt = i;}
void output(){    int i, j;    int n;    for(i = 0; i < cnt; i ++)    {        if(a <= H[i])            break;    }    if(b >= H[cnt - 1])        j = cnt;    else    {        for(j = 0; j < cnt; j ++)        {            if(b == H[j])            {                j ++;                break;            }            else if(b < H[j])                break;            else                ;        }    }    for(n = i; n < j; n ++)    {        cout << H[n] << endl;    }}
回文质数要点:1,偶数位的回文质数都能被11整除
2,9位数没有质数
3,求7位的回文质数可以穷举5位数来求
4,3位的,5位的同上
5,先举出回文数再判素数
根据以上要点,求回文质数会很简单。
希望能对大家有帮助!!!

原创粉丝点击