https://vjudge.net/problem/HDU-1431
关键: 1.找某个范围内素数的个数,先采用素数打表预处理(就是在输入之前判断好了哪些是素数)效率高,.否则超时,用一标志数组isPrime[i] 记录这个数i是不是素数,为了避免超内存,这个数组是bool类型
2.题目给的范围到了10亿,依然会超内存,怎么缩小这个数组的大小?我们只有自己在机上先跑一遍,然后看10亿里面最大的那个回文素数是多少,然后用那个数来确定isPrime开多大
3.解决超时和超内存问题,这题才可以做。继续努力吧。
#include<stdio.h> #include<memory.h> const int maxn = 100000000000; bool isPrime[maxn]; int prime[1000+100];//记录回文素数 int cnt = 0;//回文素数的个数 int huiwen(int n)//测试是不是回文 { int tmp = n; int rs = 0; while(n>0) { rs = rs*10+n%10; n=n/10; } if(rs==tmp)return 1; return 0; } void del() { isPrime[1]=1; isPrime[2]=0; isPrime[3]=0; for(int i=2;i<=maxn;i++)//素数打表 { if(!isPrime[i])//是素数 { if(huiwen(i))//回文检测 { prime[cnt++]=i; } for(int j=i+i;j<=maxn;j=j+i) { isPrime[j]=1; //不是素数 } } } } int main() { int n,m; memset(isPrime,0,sizeof(isPrime));//0是代表是素质 del(); while(~scanf("%d %d",&n,&m)) { for(int i=0;i<cnt;i++) { if(prime[i]<n)//要在n~m内找素数 { continue; } if(prime[i]>m) { break; } printf("%d\n",prime[i]); } printf("\n"); } return 0; }