 /**//*
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;
}
|