【题目链接】
【题目考点】
1. 函数
2. 质数
3. 回文数
【解题思路】
输入的数字n可以达到9位数字,枚举判断每个数字是否是回文数与质数,复杂度会过高。
可以先构造出n位数字所有可能的回文数,以下有两种构造回文数字的方法:
方法1:对于一个任意的x位数字,将x的倒序数字接在原数字x的后面,就可以构造出一个2x位的回文数。
例:数字123可以构造出123321。数字56可以构造出5665
方法2:将x的倒序数字接在原数字x的后面,并重合一位数字,就可以构造出一个2x-1位的回文数。
例:数字123可以构造出12321。数字56可以构造出565
反过来想,一个n位的回文数字,
如果n是偶数,那么遍历所有 n 2 \frac{n}{2} 2n位的整数,用方法1可以构造出所有n位的回文数。
如果n是奇数,那么遍历所有 n + 1 2 \frac{n+1}{2} 2n+1位的整数,用方法2可以构造出所有n位的回文数。
构造出所有n位数字的回文数,依次判断每个回文数字是否是质数,如果是,则将数字填充到数组中。
最后输出数组长度及数组的内容。(这一步可以使用vector)
【题解代码】
解法1:填充数组
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int rev(int x)//得到x的逆序数字
{
int num = 0;//y:x的逆序数字
for(int a = x; a > 0; a /= 10)
num = num*10+a%10;
return num;
}
bool isPrime(int n)//判断n是否是质数
{
if(n < 2)
return false;
for(int i = 2; i <= sqrt(n); ++i)
{
if(n%i == 0)
return false;
}
return true;
}
int main()
{
int n, d, x, y, num, mi, mx;//d:用于构造回文数的原数字位数
int a[N], ai = 0;//a:保存既是回文数又是质数的数字 ai:数字个数
cin >> n;
if(n%2 == 0)
d = n/2;
else
d = (n+1)/2;
mi = pow(10, d-1);//d位数最小值,为10^{d-1}
mx = 10*mi;//d位数最大值+1,为10^d
for(x = mi; x < mx; ++x)//x:用于构造回文数的原数字
{
y = rev(x);//y:x是逆序数字
if(n%2 == 0)
num = x*mx+y;//构造2d位的回文数:x*10^d+y
else
num = x/10*mx+y;//构造2d-1位的回文数:x/10*10^d+y
if(isPrime(num))
a[++ai] = num;
}
cout << ai << endl;
for(int i = 1; i <= ai; ++i)
cout << a[i] << ' ';
return 0;
}
解法2:使用vector
#include<bits/stdc++.h>
using namespace std;
int rev(int x)//得到x的逆序数字
{
int num = 0;//y:x的逆序数字
for(int a = x; a > 0; a /= 10)
num = num*10+a%10;
return num;
}
bool isPrime(int n)//判断n是否是质数
{
if(n < 2)
return false;
for(int i = 2; i <= sqrt(n); ++i)
{
if(n%i == 0)
return false;
}
return true;
}
int main()
{
int n, d, x, y, num, mi, mx;//d:用于构造回文数的原数字位数
vector<int> vec;//保存既是质数又是回文数的数字
cin >> n;
if(n%2 == 0)
d = n/2;
else
d = (n+1)/2;
mi = pow(10, d-1);//d位数最小值,为10^{d-1}
mx = 10*mi;//d位数最大值+1,为10^d
for(x = mi; x < mx; ++x)//x:用于构造回文数的原数字
{
y = rev(x);//y:x是逆序数字
if(n%2 == 0)
num = x*mx+y;//构造2d位的回文数:x*10^d+y
else
num = x/10*mx+y;//构造2d-1位的回文数:x/10*10^d+y
if(isPrime(num))
vec.push_back(num);
}
cout << vec.size() << endl;
for(int i = 0; i < vec.size(); ++i)
cout << vec[i] << ' ';
return 0;
}