传送门
P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路
暴搜,只是要想尽一切办法优化,不让程序超时
三个函数:
1.isprime(int x)
判断素数
2.huiWen(int x)
判断回文数
技巧:读位数存数组里分两半查找,都相同就是回文数
3.num(int x)
判断位数
可以用计数器的,但是当时WA太多次脑残了
最后乱优化了,你可以看到我代码里的💩,那些自己看注释就行了
代码
#include <bits/stdc++.h>
using namespace std;
bool isprime(int x) { //判断素数,不多解释
for (int i = 2; i <= sqrt(x); ++i)
if (x % i == 0)
return 0;
return 1;
}
bool huiWen(int x) { //判断回文
int qq[1001];
int test = x, t = 0;
while (test > 0) { //读取概数每一个位
t++;
qq[t] = test % 10;
test /= 10;
}
for (int q = 1; q <= t / 2; ++q) {
if (qq[q] != qq[t - q + 1]) //判定回文关键代码
return 0;
}
return 1;
}
bool num(int x) { //判断位数,节省时间
if((x >= 100000 && x < 1000000) || (x >= 10000000 && x < 100000000) ||
(1000 <= x && x <= 9999) || (100000 <= x && x <= 999999) ||
(x >= 10 && x < 100 && x != 11) || (x >= 1000 && x < 10000)) //这里当时写麻烦了
return 0;
else
return 1;
}
int main() {
int a, b;
string s = "";
cin >> a >> b;
if (a % 2 == 0)
a++; //从奇数开始找
for (int i = a; i <= b; i += 2) { //只找奇数,降低时间
if (i == 9989900) /*此数据是在超时的程序中算出的最大回文质数+1,
所以写这儿降低时间*/
break;
if (huiWen(i) && num(i) && isprime(i)) {
s += to_string(i); //用字符串输答案,减少输出时间(当时不知道为什么这么写)
s += '\n';
}
}
cout << s;
return 0;
}