您的位置:首页 > 其它

【USACO 1.5.2】回文质数

2014-06-13 23:01 323 查看

【题目描述】

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

【格式】

INPUT FORMAT:

(file pprime.in)

第 1 行: 二个整数 a 和 b .

OUTPUT FORMAT:

(file pprime.out)

输出一个回文质数的列表,一行一个。

【分析】

晕,交了3遍才过。(不要鄙视我了==)

先判断回文数后判断质数。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <queue>
const int Max=10000000;
using namespace std;
long long a,b,ans[Max],point=0;
long long mi[15]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000ll};
void work(long long num,long long len);//len代表的数字的长度
bool prime(long long num);
int main()
{
//文件操作
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
scanf("%lld%lld",&a,&b);
for (long long i=0;i<=9;i++)
{
work(i,1);
if (i!=0) work(i*10+i,2);
}
sort(ans,ans+point);
for (long long i=0;i<point;i++) printf("%lld\n",ans[i]);
return 0;
}
bool prime(long long num)
{
for (long long i=2;i<=(long long)sqrt((double)num)+1;i++) if (num%i==0) return 0;
return 1;
}
void work(long long num,long long len)
{

if (num>b) return;
if (num>=a && prime(num)) ans[point++]=num;
for (long long i=1;i<=9;i++)
for (long long j=1;j<=5;j++)
{
if ((len+j*2-1)<=10)
work(num*mi[j]+i+i*mi[len+j*2-1],len+j*2);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: