题目
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 .
Time limit : 15 s Memory limit : 32 mb
重点
b的上限为1000000000,使用筛法建立数组会超过内存限制。
解决
题目即要求回文数又要求素数,因此通过合理构造回文数,减少循环次数。
代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int isPrime(int n) {
if (n % 2)
{
for (int i = 3; i <= sqrt(n); i += 2)
{
if (!(n % i))
{
return 0;
}
}
return 1;
}
return 0;
}
int getPalindrome() {
//用于创建回文数的生成器
static int num[] = { 0, 0, 0, 0, 0 };
num[4] += 1;
for (int i = 4; i > 0; i--)
{
if (num[i] == 10) //进位
{
num[i] = 0;
num[i - 1]++;
}
}
if (num[0] == 10)
{
return -1; //停止创建
}
int res = num[0] * 100000000 + num[1] * 10000000 +
num[2] * 1000000 + num[3] * 100000 + num[4] * 10000 + num[3] * 1000 +
num[2] * 100 + num[1] * 10 + num[0];
while (res % 10 == 0) {
res /= 10;
}
return res;
}
int main() {
int a, b;
scanf("%d %d", &a, &b);
int num;
do {
num = getPalindrome();
if (num >= a && isPrime(num))
{
//会漏掉11
if (num == 101) {
printf("11\n");
}
printf("%d\n", num);
}
} while (num <= b && num!=-1);
return 0;
}