hoj 1004 Prime Palindromes

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
先说说我的思路吧,从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 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。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值