1.5.2 Prime Palindromes 迴文質數(構造迴文)
阿新 • • 發佈:2018-12-10
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; }