您的位置:首页 > 编程语言 > PHP开发

【回文质数】搜索

2011-12-11 13:01 141 查看
usaco 1.5

 

[编辑]描述

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

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

 

[编辑]格式

PROGRAM NAME: pprime

INPUT FORMAT:

(file pprime.in)

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

OUTPUT FORMAT:

(file pprime.out)

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

 

 

简单的搜索,但是我还单独讨论了位数为奇数和偶数,也许是想多了。

主要就是生成回文再加上判断素数。

 

#include <cstdio>
#include <cmath>

long a; long  b;
long l1=0;long l2=0;
long num[20];
long l;

long pow10(long m)
{
long tmp = 1;
for (long i=1;i<=(m>>1);i++)
{
tmp *= 10;
}
if ((m&1)==1)
{
tmp *= 10;
}
return tmp;
}

bool viuu(long m)
{
for (long i=2;i<=sqrt(m);i++)
{
if (m%i==0)
return false;
}
return true;
}

void dfs(long m)
{
if (m >= (l>>1)+1)
{
if ((l&1)==1)
{
long nnum = 0;
for (long i=1;i<=(l>>1);i++)
{
nnum = nnum*10+num[i];
}
long tmp = nnum;
for (long j=0;j<10;j++)
{
nnum = tmp*10+j;
for (long i=(l>>1);i>0;i--)
{
nnum = nnum*10 + num[i];
}
if (nnum<=b&&nnum>=a)
if (viuu(nnum))
{
printf("%ld\n",nnum);
}
}
}
else
{
long nnum = 0;
for (long i=1;i<=(l>>1);i++)
{
nnum = nnum*10+num[i];
}
for (long i=(l>>1);i>0;i--)
{
nnum = nnum*10+num[i];
}
if (nnum<=b&&nnum>=a)
if (viuu(nnum))
{
printf("%ld\n",nnum);
}
}
return;
}
for (long i=0;i<10;i++)
{
num[m] = i;
dfs(m+1);
}
}

int main()
{
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
scanf("%ld%ld",&a,&b);
long tmp = a;
while (tmp>0)
{
l1 ++ ;
tmp /= 10;
}
tmp = b;
while (tmp>0)
{
l2 ++ ;
tmp /= 10;
}

if (l1==1)
{
if (a<=2) printf("2\n3\n5\n7\n");
else if(a<=3) printf("3\n5\n7\n");
else if(a<=5) printf("5\n7\n");
else if(a<=7) printf("7\n");
l1 = 2;
}
for (long i=l1;i<=l2;i++)
{
l = i;
for (long j=1;j<=9;j+=2)
{
num[1] = j;
dfs(2);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  file output input