Prime Palindromes
Time limit : 15 sec
Memory limit : 32 M
The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 1000,000,000); both a and b are considered to be within the range .
Input
Line 1: Two integers, a and b
Output
The list of palindromic primes in numerical order, one per line.
Sample Input
5 500
Sample Output
5
7
11
101
131
151
181
191
313
353
373
383
7
11
101
131
151
181
191
313
353
373
383
先说说我的思路吧,从5~1000,000,000依次枚举回文素数显然不太现实,简单点我们可以考虑,
由一半的数字,生成另外一半的数字,构成回文数。
例如:
12对照生成121
13对照生成131
13对照生成131
......
97对照生成979。
那么要枚举三位数的回文素数,只需要在10~99内枚举。
以此类推,要枚举1000,000,000内的回文素数那么只需要到枚举到99999即可,枚举量大大减少。
枚举出回文数后,再判断是否为素数就简单的多了。
特别的由于12不仅可以生成121,还可以生成1221,
13还可以生成1331(偶数位的回文数)
那么偶数位的回文数是否有枚举的必要呢?答案我不太确定。
我用程序验证的结果是:生成的偶数位的回文数全是合数,这个证明我无能为力。⊙﹏⊙b汗
int CreatePalindromes(int num)
{
int i,j;
char A[20] = { 0 };
if (num < 10)
return num;
else
{
sprintf(A, "%d", num);
j = strlen(A);
for (i = strlen(A) -1; i >= 0; i--)
{
A[j++] = A[i];
}
A[j] = '\0';
}
return atoi(A);
}
具体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define N 6000
int num[N];
int IsPrime(int n)
{
int i;
for (i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
return 0;
}
return 1;
}
int CreatePalindromes(int num)
{
int i,j;
char A[20] = { 0 };
if (num < 10)
return num;
else
{
sprintf(A, "%d", num);
j = strlen(A);
for (i = strlen(A) -2; i >= 0; i--)
{
A[j++] = A[i];
}
A[j] = '\0';
}
return atoi(A);
}
// 用打表的方式保存结果。
void CreateTable()
{
memset(num, 0, sizeof(num));
int i, j = 0;
for (i = 5; i <= 99999; i++)
{
int A = CreatePalindromes(i);
// 判断生成的回文数是否为素数,加个范围防止溢出
// 32位int型的范围为:2147483647
if (IsPrime(A) && A<1000000000)
{
num[j++] = A;
}
if (A == 7)
{
// 必须要加这一句,11是一个很特殊的数。
num[j++] = 11;
}
}
}
void PrintResult(int m,int n)
{
int i;
for (i = 0; i < N; i++)
{
if (num[i] >= m && num[i] <= n)
printf("%d\n", num[i]);
}
}
int main()
{
int m, n;
CreateTable();
scanf("%d%d", &m, &n);
PrintResult(m, n);
return 0;
}
代码写的很烂,凑合看吧o(╯□╰)o。。。