2457 - 回文质数

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

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

题目输入

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

输入包含多组测试数据

题目输出

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

输入/输出样例

题目输入

5 500

题目输出

5
7
11
101
131
151
181
191
313
353
373
383

C++解答

#include <stdio.h>
#include <math.h>
int main()
{
	long c[50000]={0};
    int u=0;
	for(int i=1;i<=10;i+=2){
			if(i==5)
				continue;
			for(int j=0;j<=9;j++){
				c[u++]=(i*1000+i*1)+(j*100+j*10);
				c[u++]=(i*100+i*1)+(j*10);
				for(int k=0;k<=9;k++){
					 c[u++]=(i*100000+i*1)+(j*10000+j*10)+(k*1000+k*100);
						 c[u++]=(i*10000+i*1)+(j*1000+j*10)+(k*100);
					for(int r=0;r<=9;r++){
					  c[u++]=(i*10000000+i*1)+(j*1000000+j*10)+(k*100000+k*100)+(r*10000+r*1000);
					  c[u++]=(i*1000000+i*1)+(j*100000+j*10)+(k*10000+k*100)+(r*1000);
					}
				}
			}
		}
		c[u++]=11;c[u++]=7;c[u++]=5;c[u++]=3;c[u]=2;
	long d[5000]={0};
	int q=0;
	for(int w=0;w<=u;w++){
		int   flag=0;
	    for(int j=2;j<=sqrt(double(c[w]));j++){
			if(c[w]%j==0)
			   {flag=1; break;}
	     	}
		if(flag==0)
			d[q++]=c[w];
       }
	long temp=0;/*排序过程*/
	for(int i=0;i<q;i++)
		for(int j=1;j<q-i;j++)
			if(d[j]<d[j-1]){
			  temp=d[j-1];
			  d[j-1]=d[j];
			  d[j]=temp;
			}
	long a,b;
	while(scanf("%d%d",&a,&b)!=EOF){
	for(int p=0;p<q;p++){
	   if(d[p]>=a&&d[p]<=b)
		   printf("%ld\n",d[p]);
	  }
	}
return 0;
}
时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题