#include<iostream>//isprimes加上会运行的更快,但是线上OLE。。。不清楚原因
#include<vector>
#include<string>
#include<set>
#include<cmath>
using namespace std;
bool isPrime(int num,vector<int>primes) {for (int i = 0; i < primes.size() && primes[i] <= sqrt(num); i++) {if (num%primes[i] == 0) {return 0;}}return 1;
}
int main() {vector<int>primes;set<int>result;int n;cin >> n;if (n) { primes.push_back(2);}int ranges = pow(10, n);int temp = int(sqrt(ranges)) + 1;//bool *isprimes = new bool[temp];for (int i = 3; i*i<=ranges; i+=2) {//if (isprimes[i]) {bool fg = true;for (int j = 0; j < primes.size() && primes[j] <= sqrt(i); j++) {if (i%primes[j] == 0) {fg = false;break;}}if (fg) {primes.push_back(i);//int step = i << 1;//for (int j = i*i; j <= temp; j+=step) {// isprimes[j] = false;//}}//}}for (int i = n; i <=n; i++) {if (i == 1) {result.insert(2);result.insert(3);result.insert(5);result.insert(7);}else {if (i % 2 == 0) {int pre = i / 2;int ranges = pow(10, pre);for (int hw =pow(10,pre-1); hw < ranges; hw++) {string s = to_string(hw);s += string(s.rbegin(), s.rend());int temp = stoi(s);if (isPrime(temp, primes)) {result.insert(temp);}}}else {int pre = i / 2;int ranges = pow(10, pre);for (int hw = pow(10, pre - 1); hw < ranges; hw++) {for (int mid = 0; mid < 10; mid++) {string s = to_string(hw);string s0 = s;s += to_string(mid);s += string(s0.rbegin(), s0.rend());int temp = stoi(s);if (isPrime(temp, primes)) {result.insert(temp);}}}}}}cout << result.size() << endl;while (!result.empty()) {cout << *result.begin();result.erase(result.begin());if (!result.empty()) {cout << ' ';}}//delete[]isprimes;
}
详细解决方案
百练OJ-回文素数
热度:45 发布时间:2023-09-18 19:07:04.0
相关解决方案