求回文素数,开始直接枚举判断果断tle,后来网上找优化,发现除了11,偶数长度的回文数都可以被11整出,应为上限是100,000,000,所以只需要在长度为 1,3,5,7里寻找(11除外),
看到大牛门直接先用循环生成长度为奇数的回文数再判断素数,我偷鸡了下,直接在a=<i=<b里加速,if(i=999) i=10001...勉强过了 万幸,生成方法参考http://www.cnblogs.com/zjbztianya/archive/2013/01/31/2886509.html
/* ID: hubiao cave PROG: pprime LANG: C++ */ #include<iostream> #include<fstream> #include<string> using namespace std; bool IsPrime(int); bool IsPa(int); char buf[10]; bool getLength(int n); int main() { ifstream fin("pprime.in"); ofstream fout("pprime.out"); int a,b; fin>>a>>b; for(int i=a;i<=b;i++) { if(i==999) { i=10001; } if(i==99999) { i=1000001; } if(i==9999999) break; if(IsPa(i)) if(IsPrime(i)) fout<<i<<endl; } return 0; } bool IsPrime(int n) { if(n/5==0&&n>5) return false; if(n==5) return true; for(int i=2;i*i<=n;i++) { if(n%i==0) return false; } return true; } bool IsPa(int n) { int m=n,i=1; while(m/10) { buf[i]=m%10; i++; m=m/10; } buf[i]=m; if(i==1) return true; for(int p=1;p<=i;p++) { if(buf[p]!=buf[i-p+1]) return false; } return true; } bool getLength(int n) { if(n==11) return true; if(n/10>=1&&n/10<=9) return false; if(n/1000>=1&&n/1000<=9) return false; if(n/100000>=1&&n/100000<=9) return false; if(n/10000000>=1&&n/10000000<=9) return false; return true; }