• HDU1431 素数回文


    问题链接HDU1431 素数回文

    问题简述:参见上述链接。

    问题分析看似比较简单的问题,实际上需要一个过程来解决,否则不是时间出问题,就是空间出问题。

    首先,需要编写一个程序,计算1到100000000之间的回文素数,得到两个值。一是这个区间的最大回文素数是9989899,二是这个区间的回文素数个数是780个。

    因此,在定义数组空间时,就可以取一个合适的数值,避免空间超出限制范围。同时可以节省存储空间,加快程序运行速度。

    另外,使用布尔数组作为素数筛选标志也可以大量节省存储。

    算法策略上,先行筛选素数再判定是否是回文数,时间上比较好一点,逻辑上也比较顺。

    程序说明:(略)。

    AC的C语言程序如下:

    /* HDU1431 HIT1004 回文素数 */
    
    #include <iostream>
    #include <math.h>
    #include <stdio.h>
    
    using namespace std;
    
    #define MAXN 9989899
    
    bool isprime[MAXN+1];
    int prime[800];
    int count;
    
    // 函数功能:判断n是否为回文数
    // 参数n:需要判断是否为回文数的数
    bool isPalindrome(int n)
    {
        int temp1 = n, temp2 = 0;
    
        while(n > 0) {
            temp2 = temp2 * 10 + n % 10;
            n /= 10;
        }
    
        return temp1 == temp2;
    }
    
    // Eratosthenes筛选法,包含回文数判断
    void sieveofe(bool isprime[], int prime[], int n, int &count)
    {
        int i, j;
    
        count = 0;
        isprime[0] = false;
        isprime[1] = false;
        isprime[2] = true;
    
        // 初始化
        for(i=3; i<=n; i++) {
            isprime[i++] = true;
            isprime[i] = false;
        }
        int max = sqrt(n);
        for(i=3; i<=max; i++){
            if(isprime[i]) {
                for(j=i+i; j < n; j+=i)    //进行筛选
                    isprime[j] = false;
            }
        }
    
        // 将回文素数放数组prime中,在这里判断是否是回文数
        prime[0] = 2;
        j = 1;
        for(i=3; i<=n; i+=2)
            if(isprime[i] && isPalindrome(i))
                prime[j++] = i;
    
        count = j;
    }
    
    int main()
    {
        sieveofe(isprime, prime, MAXN, count);
    
        int a, b;
    
        while(~scanf("%d%d",&a,&b)) {
            for(int i=1; i<count; i++) {
                if(prime[i] < a)
                    continue;
                if(prime[i] > b)
                    break;
                printf("%d
    ", prime[i]);
            }
            printf("
    ");
        }
    
        return 0;
    }


  • 相关阅读:
    无题
    赌对了
    赌:
    这次是真的再见了,oi退役回忆录
    线段树(lazy标记)
    《挑战》2.1 POJ POJ 1979 Red and Black (简单的DFS)
    《挑战》2.1 POJ 2386 Lake Counting (简单的dfs)
    TC安装全系列教程
    ProblemC 剪花布条(KMP基础)
    多校+CF简单题
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564879.html
Copyright © 2020-2023  润新知