您的位置:首页 > 其它

洛谷 P1217 回文质数 Prime Palindromes(递归)

2018-03-07 12:52 357 查看
思路:

可以直接暴力打表,本着锻炼递归的想法,没有实现该方法。

选择了递归道路,生成所有数据范围内回文数,将符合要求的数存入ans数组,再进行排序。

偶数位回文质数只有11,可以特判。

本代码应该生成了1-8位数的所有回文数(包括偶数位

代码较丑,本人较懒,故不做修改(ಥ_ಥ)  

代码:

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

int l,r,index=0,ans[10005];

//返回10^n
int f(int n)
{
int ans=1;
for(int i=n;i>0;i--)
ans*=10;
return ans;
}

//判断是否为质数
void judge(int n)
{
if(n==1)return;
int s=sqrt(n)+1,i;
for(i=2;i<s;i++)
if(!(n%i))break;
if(i==s)
ans[index++]=n;
}

//创造回文数
void creat(int a,int length)
{
if(length>6)return;
for(int i=0;i<10;i++)
{
int n=(a+i*f(length))*10+i;
//判断是否属于范围内,是否首位不为0,是否为质数
if(n%10&&l<=n&&n<=r)judge(n);

creat(n,length+2);
}
}

int main()
{
scanf("%d%d",&l,&r);

//创造奇数位回文数
for(int i=0;i<10;i++)
{
if(l<=i&&i<=r)judge(i);
creat(i,1);
}
//创造偶数位回文数
for(int i=0;i<100;i+=11)
{
if(l<=i&&i<=r)judge(i);
creat(i,2);
}
sort(ans,ans+index);
for(int i=0;i<index;i++)printf("%d\n",ans[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: