hoj 1004 Prime Palindromes

来源:互联网 发布:模拟人生要网络嘛 编辑:程序博客网 时间:2024/05/16 08:32

Prime Palindromes

 Time limit : 15 secMemory 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
先说说我的思路吧,从5~1000,000,000依次枚举回文素数显然不太现实,简单点我们可以考虑,
由一半的数字,生成另外一半的数字,构成回文数。
例如:
12对照生成121
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 6000int 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型的范围为:2147483647if (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。。。

1 0
原创粉丝点击