1. 程式人生 > >USACO-Section1.5 Prime Palindromes [迴文數][質數]

USACO-Section1.5 Prime Palindromes [迴文數][質數]

2017-7-15

題目大意

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

題解

感覺迴文數的數量要比質數少,而且生成迴文數比生成質數要容易的多,所以我們生成[a,b]之間的迴文數,然後判斷這些迴文數是否是質數。把滿足條件的存下,最後排序,輸出。
迴文數的生成要分位數為奇數或者偶數。
關於判斷一個數是否是質數,有更高效的演算法,但是理解起來、寫起來都比較複雜。以後在整理。

程式碼

#include <iostream>
#include <fstream> #include <cmath> #include <algorithm> #include <vector> #define cin fin #define cout fout using namespace std; ifstream fin("pprime.in"); ofstream fout("pprime.out"); int a, b; vector<int> ans; bool isprime(int n) { if (!(n%2)) return false; for
(int i = 3; i <= sqrt(n); i+=2) { if (!(n%i)) return false; } return true; } int main() { cin >> a >> b; for (int i = 1; i <= b; i++) { int m = i, num = i; // 奇數位數 m /= 10; while (m) { num *= 10; num += m % 10
; m /= 10; } if (num > b) break; if (num >= a && isprime(num)) { ans.push_back(num); } // 偶數位數 m = i, num = i; while (m) { num *= 10; num += m % 10; m /= 10; } if (num >= a && isprime(num)) { ans.push_back(num); } } sort(ans.begin(), ans.end()); for (int i = 0; i < ans.size(); i++) cout << ans[i] << endl; return 0; }