Problem Description
xiaoou33对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100,000,000);
Input
这里有许多组数据,每组包括两组数据a跟b。
Output
对每一组数据,按从小到大输出a,b之间所有满足条件的素数回文数(包括a跟b)每组数据之后空一行。
Sample Input
5 500
Sample Output
5 7 11 101 131 151 181 191 313 353 373 383很坑的题目,不用筛法,超时,用筛法,超内存。第一代码: 超时#include<stdio.h> int is_prime(int x) { int i; if(x<=1) return 0; for( i=2;i*i<=x;i++) if(x%i==0) return 0; return 1; } int change(int y) { int s=0; while(y) { s=s*10+y%10; y/=10; } return s; } int main() { int a,b; int i; while(scanf("%d%d",&a,&b)!=EOF) { for(i=a;i<=b;i++) { if(is_prime(i)&&change(i)==i) printf("%d\n",i); }
printf("\n"); } return 0; }
第二代码: 超内存 5 --100,000,000 之间最大的回文数就是9989899,故此数组开到9989899稍大就行;#include<stdio.h> int change(int y) { int s=0; int t=y; while(y) { s=s*10+y%10; y/=10; } return s==t; } int a[9999899]={0}; int main() { int i,j; int x,y; a[1]=1; a[0]=1; for(i=2;i<=9989899;i++) { if(!a[i]) { for(j=i+i;j<=9989899;j+=i) a[j]=1; } } while(scanf("%d%d",&x,&y)!=EOF) { if(y>9989899) y=9989899; for(i=x;i<=y;i++) { if(!a[i]&&change(i)) printf("%d\n",i); } printf("\n"); } return 0; }
经过一下午,发现了bool类型数据,是内存减少了好些#include<stdio.h> int change(int y) { int s=0; int t=y; while(y) { s=s*10+y%10; y/=10; } return s==t; } bool a[9999899]={0}; int main() { int i,j; int x,y; a[1]=1; a[0]=1; for(i=2;i<=9989899;i++) { if(!a[i]) { for(j=i+i;j<=9989899;j+=i) a[j]=1; } } while(scanf("%d%d",&x,&y)!=EOF) { if(y>9989899) y=9989899; //同时注意此处y的值可能大于9989899, for(i=x;i<=y;i++) { if(!a[i]&&change(i)) printf("%d\n",i); } printf("\n"); } return 0; }