1. 程式人生 > >1.5.2 Prime Palindromes 迴文質數(構造迴文)

1.5.2 Prime Palindromes 迴文質數(構造迴文)

Description

因為151即是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 號是迴文質數。 寫一個程式來找出範圍[a,b](5 <= a < b <= 100,000,000)間的所有迴文質數;

Input

第 1 行: 二個整數 a 和 b

Output

輸出一個迴文質數的列表,一行一個。

Sample Input

5 500

Sample Output

5
7
11
101
131
151
181
191
313
353
373
383

思路:首先我們構造一個迴文,我們可以觀察到前11個數,為什麼我們讓前11個數為分界線呢?

因為如果我們讓5~11的資料先進行構造迴文,那麼11這個資料就會被構造為111,就不會存在11這個質數

我們可以直接求出質數,然後存入陣列,然後剩下的數字我們只需要計算10~10000次迴圈來構造100000000資料大小的數,然後存入陣列,最後求a~b範圍內的資料

程式碼:

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
typedef long long LL;
const long long INF = 0x3f3f3f3f;
const long long mod = 1e9+7;
const double PI = acos(-1.0);
const int maxx = 125000;
#define MAX 10010
using namespace std;
int c[1000000];
int f(int n)
{
    LL k,i;
    k=sqrt(n);
    for(i=2; i<=k+1; i++)
        if(n%i==0)
            return 0;
    return 1;
}
int f1(int n)
{
    int sum=n/10;
    while(n!=0)
    {
        sum=sum*10+n%10;
        n/=10;
    }
    return sum;
}
int main()
{
    int a,b,k=0,ans=0;
    cin>>a>>b;
    if(a<12)
    {
        for(int i=a; i<=11; i++)
        {
            if(f(i)==1)
                c[k++]=i;
        }
    }
    for(int i=a; i<=10000; i++)
    {
        ans=f1(i);
        if(f(ans)==1)
        {
            c[k++]=ans;
        }
    }
    for(int i=0; i<k; i++)
    {
        if(c[i]>=a&&c[i]<=b)
            cout<<c[i]<<endl;
    }
    return 0;
}