USACO 1.5.2 ★Prime Palindromes

题意:给定区间[a, b]求出区间里面的所有 回文质数

解法:

        最简单的做法是枚举所有的数字,判断两个条件,但在第9组数据的时候时间会爆

        看了一下HINT,题目提示预先产生所有的回文数,将遍历所有数组的时间将为常数时间产生数组,

HINT给出的回文数产生方法更为巧妙,采用这样的思路大幅降低了运行时间

/*
ID: lsswxr1
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

#define USACO
#ifdef USACO
#define cin fin
#define cout fout
#endif
//////////////////////////////////////////////////////////////////////////
///宏定义
const int  INF = 1000000000;
const int MAXN = 10251;
const int maxn = MAXN;
///全局变量 和 函数

int a, b;
bool isPrime(int cur)
{
    for (int i = 2; i <= sqrt(double(cur)); i++)
    {
        if (cur % i == 0)
            return false;
    }
    return true;
}
int palinArray[maxn];
int main()
{


#ifdef USACO    
    ofstream fout ("pprime.out");
    ifstream fin ("pprime.in");
#endif   
    while (cin >> a >> b)
    {
        //产生回文数
        int cntPalins = 0;
        //1    digit
        for (int i = 5; i <= 9; i++)
        {    

            if (i >= a && i <= b)
            {
                palinArray[cntPalins++] = i;
            }
            
        }
        //2 digit
        if (11 >= a && 11 <= b)
        {
            palinArray[cntPalins++] = 11;
        }
        
        //3 digit
        for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */
        {    
            for (int d2 = 0; d2 <= 9; d2++) 
            {
                int palindrome = 100 * d1 + 10 * d2 + d1;
                if (palindrome >= a && palindrome <= b)
                {
                    palinArray[cntPalins++] = palindrome;
                }
                
            }
        }

        //5 digit
        for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */
        {    
            for (int d2 = 0; d2 <= 9; d2++) 
            {
                for (int d3 = 0; d3 <= 9; d3++) 
                {
                    int palindrome = 10000 * d1 + 1000 * d2 +100 * d3 + 10 * d2 + d1;
                    if (palindrome >= a && palindrome <= b)
                    {
                        palinArray[cntPalins++] = palindrome;
                    }
                    
                }
            }
        }
        
        //7digit
        for (int d1 = 1; d1 <= 9; d1+=2) /* only odd; evens aren't so prime */
        {    
            for (int d2 = 0; d2 <= 9; d2++) 
            {
                for (int d3 = 0; d3 <= 9; d3++) 
                {
                    for (int d4 = 0; d4 <= 9; d4++)
                    {
                        int palindrome = 1000000 * d1 + 100000 * d2 +10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1;
                        if (palindrome >= a && palindrome <= b)
                        {
                            palinArray[cntPalins++] = palindrome;
                        }
                        
                    }

                }
            }
        }

        //
        for (int i = 0; i <    cntPalins; i++)
        {
            if (isPrime(palinArray[i]))
            {
                cout << palinArray[i] << endl;
            }
        }
    }


    ///结束
    return 0;
}

 

posted on 2013-12-26 12:57  小书包_Ray  阅读(223)  评论(0编辑  收藏  举报

导航