题目描述:
因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;(翻译来源:NOCOW)
INPUT FORMAT:
(file pprime.in)
第 1 行: 二个整数 a 和 b .
OUTPUT FORMAT:
(file pprime.out)
输出一个回文质数的列表,一行一个。
SAMPLE INPUT
5 500
SAMPLE OUTPUT
5
7
11
101
131
151
181
191
313
353
373
383
解题思路:
借鉴题目给的思想,枚举回文数再计算(如果用筛法空间占用太大)。偶数回文数能被11整除(注意11符合),下面是代码。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int ans[100010],count=0;
int fun(int a){//判断素数
int i;
for(i=2;i<=sqrt(a);i++){
if(a%i==0)return 0;
}
return 1;
}
int main(){
FILE *fin = fopen ("pprime.in", "r");
FILE *fout = fopen ("pprime.out", "w");
int a,b;
fscanf(fin,"%d%d",&a,&b);
int i,a1,a2,a3,a4,flag=0,flag1=0;//flag判断是否大于b,flag1判断11是否添加过了
for(a1=0;a1<=9;a1++){//4重循环~
if(flag==1)break;
for(a2=0;a2<=9;a2++){
if(flag==1)break;
for(a3=0;a3<=9;a3++){
if(flag==1)break;
for(a4=0;a4<=9;a4++){
int temp;
if(a1){temp=a1*1000000+a2*100000+a3*10000+a4*1000+a3*100+a2*10+a1;}
else if(a2){temp=a2*10000+a3*1000+a4*100+a3*10+a2;}
else if(a3){
if(b>=11&&flag1==0){//将b添加到ans数组,注意限制条件,只添加一次
if(a<=11)
ans[count++]=11;
flag1=1;
}
temp=a3*100+a4*10+a3;}
else temp=a4;
if(temp>b){//如果大于b就退出循环
flag=1;
break;
}
else if(fun(temp)&&temp>=a)//如果大于a且是素数就添加
ans[count++]=temp;
}
}
}
}
for(i=0;i<count;i++){
fprintf(fout,"%d\n",ans[i]);
}
exit(0);
}