** 题目**
1. 解题思路
1.先试用一个for循环,对[a,b]中的每个数字进行判断;
2.写一个函数:判断是不是素数
3. 写一个函数:判断是不是质数
4. 最后两个条件都满足,打印对应的数字。
2. 初始版本
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
bool is_huiwen(long long n) {
bool is_hui = true;
string s = to_string(x);
int lenth_s = s.length();
for (int i = 0; i < lenth_s; i++) {
if (s[i] != s[lenth_s - 1 - i]) {
is_hui = false;
break;
}
}
return is_hui;
}
bool is_sushu(long long x) {
bool is_num = true;
for (long long i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
is_num = false;
break;
}
}
return is_num;
}
int main() {
long long a, b;
cin >> a >> b;
for (long long j = a; j <= b; j++) {
if (is_huiwen(j)) {
if (is_sushu(j)) {
cout << j << endl;
}
}
}
}
3.第一步优化
如果你写到了这里,所有的测试点不会全部AC,主要的问题是时间的限制,题目的要求是5-1亿,所以就需要对代码进行优化。
1.仔细观察一下,满足条件的都是奇数,偶数一定不满足条件,因为偶数一定可以被2整除。所以修改的第一部,把每次循环的步长进行修改,注意⚠️:要先判断一下a是不是偶数!!!!
int main() {
long long a, b;
cin >> a >> b;
if (a % 2 == 0) a++;
for (long long j = a; j <= b; j+=2) {
if (is_huiwen(j)) {
if (is_sushu(j)) {
cout << j << endl;
}
}
}
}
2.修改完毕之后,记得也要修改一下判断质数的函数,对于偶数是不需要进行判断的,而且对于判断质数的范围直接从3开始就可以,不需要从2开始!修改完毕的代码:
bool is_sushu(long long x) {
bool is_num = true;
for (long long i = 3; i <= sqrt(x); i+=2) {
if (x % i == 0) {
is_num = false;
break;
}
}
return is_num;
}
4.第二步优化
修改到这里,如果你去尝试,发现还是没有办法通过的,那么,我们仔仔细的考虑一下,5-1亿,是不是不需要全部循环,我们只需要看一下,5-1亿中最大的符合条件的数字就可以。你可以看一下,最大的回文素数是9989899,所以对于b的范围我们可以缩小一下,如果b>10000000,那么直接让b=10000000;,这样的话,可以把绝大多数的数字排出去。
6.代码最终版
在优化的过程中,还牵扯到了一个数学上的规律,这里不做多解释,有兴趣的可以自行研究,以下为最终版代码!
注:判断回文数提供了两种办法,我是用的是字符串的形式,还有一种比较巧妙的办法,可以自行研究一下!
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
bool is_huiwen(long long x) {
bool is_hui = true;
string s = to_string(x);
int lenth_s = s.length();
for (int i = 0; i < lenth_s; i++) {
if (s[i] != s[lenth_s - 1 - i]) {
is_hui = false;
break;
}
}
return is_hui;
/*int s = 0, k = n;
while (k != 0) {
s *= 10;
s += k % 10;
k /= 10;
}
if (s == n) {
return true;
}
else {
return false;
}*/
}
bool is_sushu(long long x) {
bool is_num = true;
for (long long i = 3; i <= sqrt(x); i+=2) {
if (x % i == 0) {
is_num = false;
break;
}
}
return is_num;
}
int main() {
long long a, b;
cin >> a >> b;
if (a % 2 == 0) a++;
for (long long j = a; j <= b; j+=2) {
if (is_huiwen(j)) {
if (is_sushu(j)) {
cout << j << endl;
}
}
}
}