素數迴文 HDU - 1431
阿新 • • 發佈:2018-12-01
素數迴文
題意:找出區間[a, b]之間既是素數,又是迴文數的所有數並列印;
思路:很有意思的一道題,一開始竟然想著用數位DP,,,然而並不用,利用迴文數的性質構造迴文數,然後判斷構造的數是不是迴文數就ok了;
#include <bits/stdc++.h> using namespace std; bool Isprime(int x){//不能去篩素數,就算是尤拉篩素複雜度也是O(n),對於n=1e9不滿足,所以直接判斷素數,O(sqrt(n))的複雜度,因為0~1e9最多也就是A(10, 5)+A(10, 4)+A(10, 3)+A(10, 2)+A(10, 1)個迴文數; if(x==1) return false; for(int i=2; i*i<=x; i++){ if(x%i==0) return false; } return true; } int a, b; void dfs(int x, int n, int num, int limit){ if(x==n){ int temp=num; if(limit) temp/=10; while(temp){ num=num*10+temp%10; temp/=10; } if(Isprime(num)&&num>=a&&num<=b) printf("%d\n", num); return; } for(int i=0; i<=9; i++){ if(i==0&&x==0) continue; dfs(x+1, n, num*10+i, limit); } } int main(){ while(scanf("%d%d", &a, &b)!=EOF){ //這裡偷懶了,直接在所有方案中找滿足在區間[a, b],且是素數的構造,其實根據a, b,的數位的長度直接找在a, b數為長度範圍內的數; for(int i=1; i<=5; i++){ dfs(0, i, 0, 1); dfs(0, i, 0, 0); } puts(""); } return 0; }