HOJX-1004

来源:互联网 发布:淘宝网男包包 编辑:程序博客网 时间:2024/06/16 02:23

题目

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;}