1回文素数的定义就是,一个素数, 无论从左到右读,还是从右往左读,他都是同一个数,比如 2, 11 等等
回文素数有以下规律
当位数为1时有:
2 3 5 7
当位数为2的时候,仅仅有一个数:
11
当数是4,6,8....2n+2 (n=1,2,3.....)没有该回文素数,因为这些数都可以被11整除
以下代码为求1<=n <=9 位数的回文数求发:
- #include <stdio.h>
- #include <math.h>
- #include <string.h>
- bool isprime(int n)
- {
- if (n<2)
- {
- return false;
- }
- else
- {
- for (register int i=2; i<=(int)sqrt(n); i++)
- {
- if (n%i == 0)
- {
- return false;
- }
- }
- return true;
- }
- }
- void initprime(int data[], int num)
- {
- int flag = 0;
- data[0]=1;
- data[1]=2;
- for (int i=3; i<num; i++)
- {
- flag = 0;
- for (int j=1; data[j]*data[j]<=i;j++)
- {
- if (i%data[j] == 0)
- {
- flag =1;
- break;
- }
- }
- if (flag == 0)
- {
- data[0]++;
- data[data[0]] = i;
- }
- }
- }
- int main()
- {
- int num;
- int data[5200];
- int prime[10000];
- int count=0;
- int tempdata = 0;
- int flag = 0;
- initprime(prime,100000);
- // printf("%d",prime[0]);
- while (scanf("%d", &num) != EOF)
- {
- count = 0;
- if (num==1)
- {
- printf("4/n2 3 5 7/n");
- continue;
- }
- else if (num == 2)
- {
- printf("1/n11/n");
- continue;
- }
- else if (num%2 == 0)
- {
- printf("0/n");
- continue;
- }
- else if (num == 3)
- {
- for (int i=1; i<10; i+=2)
- {
- if (i==5)
- continue;
- for (int j=0; j<10; j++)
- {
- tempdata = i*101+j*10;
- for (int s=1; prime[s]*prime[s] <=tempdata; s++)
- {
- flag = 0;
- if (tempdata%prime[s] == 0)
- {
- flag = 1;
- break;
- }
- }
- if ( flag == 0)
- {
- data[count++] = tempdata;
- }
- }
- }
- }
- else if (num == 5)
- {
- for (int i=1; i<10; i+=2)
- {
- if (i==5)
- continue;
- for (int j=0; j<10; j++)
- {
- for (int k=0; k<10; k++)
- {
- tempdata = i*10001+j*1010+k*100;
- for (int s=1; prime[s]*prime[s] <=tempdata; s++)
- {
- flag = 0;
- if (tempdata%prime[s] == 0)
- {
- flag = 1;
- break;
- }
- }
- if ( flag == 0)
- {
- data[count++] = tempdata;
- }
- }
- }
- }
- }
- else if (num == 7)
- {
- for (int i=1; i<10; i+=2)
- {
- if (i==5)
- continue;
- for (int j=0; j<10; j++)
- {
- for (int k=0; k<10; k++)
- {
- for (int l=0; l<10; l++)
- {
- tempdata = i*1000001+j*100010+k*10100+l*1000;
- for (int s=1; prime[s]*prime[s] <=tempdata; s++)
- {
- flag = 0;
- if (tempdata%prime[s] == 0)
- {
- flag = 1;
- break;
- }
- }
- if ( flag == 0)
- {
- data[count++] = tempdata;
- }
- }
- }
- }
- }
- }
- else if (num == 9)
- {
- for (int i=1; i<10; i+=2)
- {
- if (i==5)
- continue;
- for (int j=0; j<10; j++)
- {
- for (int k=0; k<10; k++)
- {
- for (int l=0; l<10; l++)
- {
- for (int m=0; m<10; m++)
- {
- tempdata = i*100000001+j*10000010+k*1000100+l*101000+m*10000;
- for (int s=1; prime[s]*prime[s] <=tempdata; s++)
- {
- flag = 0;
- if (tempdata%prime[s] == 0)
- {
- flag = 1;
- break;
- }
- }
- if ( flag == 0)
- {
- data[count++] = tempdata;
- }
- }
- }
- }
- }
- }
- }
- printf("%d/n",count);
- for (int i=0; i<count; i++)
- {
- printf("%d ",data[i]);
- }
- printf("/n");
- }
- }