USACO-Section1.5 Prime Palindromes [迴文數][質數]
阿新 • • 發佈:2019-02-07
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;
}