/**//* PROG: pprime LANG: C */ #include<stdio.h> #include<string.h> #define max 1000000 char s[max]; int P[max], k = 0; void setPrime() { int i, j, a, b = max / 2; for (i = 2; i < b; i++) { if (!s[i]) { for (j = 2; (a = i * j) < max; j++) { s[a] = 1; } } } } void set() { int i; for (i = 2; i < 10000; i++) { if (s[i] == 0) { P[k++] = i; } } } int IsPrime(int n) { int i, j; for (i = 0; i < k; i++) { if (n % P[i] == 0) { return 0; } } return 1; } int IsPPrime(int n) { int i = 0, j; int s1[11]; if (n < 10 || n == 11) { return 1; } while (n) { s1[i++] = n % 10 ; n = n / 10; } if (i % 2 == 0) { return 0; } for (j = 0; j < i / 2; j++) { if (s1[j] != s1[i - j - 1]) { return 0; } } return 1; }
int main() { FILE * fin = fopen("pprime.in", "r"); FILE * fout = fopen("pprime.out", "w"); int i, a, b; fscanf( fin, "%d%d", &a, &b); if (b > 10000000) { b = 10000000; } setPrime(); set(); for (i = a; i <= b; i++) { if (i < max) { if ( s[i] == 0 && IsPPrime(i)) { fprintf(fout, "%d\n", i); } } else { //因为这里是大数,所以用IsPrime()判断每一个数会超时,判回文反而较快。 //而对于这么多大数,用基本的去合数方法,先过滤掉些较直观的合数,这样速度就出来了。 if ( i % 2 != 0 && i % 3 != 0 && i % 5 != 0&& IsPPrime(i)&&IsPrime(i) ) { fprintf(fout, "%d\n", i); } } } return 0; }
|