USACO Prime Palindromes 构造回文数

这道题目一点也不卡素数的判断

就是朴素的sqrt(n) 也不卡

所以~放心的用吧。

构造回文的时候看了HINT

其中是这么写的:

Generate palindromes by combining digits properly. You might need more than one of the loops like below.

/* generate five digit palindrome: */
for (d1 = 1; d1 <= 9; d1+=2) {	/* only odd; evens aren't so prime */
    for (d2 = 0; d2 <= 9; d2++) {
        for (d3 = 0; d3 <= 9; d3++) {
	    palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
	    ... deal with palindrome ...
	}
    }
}

 

Source Code:

/*
ID: wushuai2
PROG: pprime
LANG: C++
*/
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0)

using namespace std;

typedef long long           ll      ;
typedef unsigned long long  ull     ;
typedef unsigned int        uint    ;
typedef unsigned char       uchar   ;

template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}

const double eps = 1e-7      ;
const int M = 660000         ;
const ll P = 10000000097ll   ;
const int INF = 0x3f3f3f3f   ;
const int MAX_N = 20         ;
const int MAXSIZE = 101000000;

bool primei(int n){
    int i, j;
    for(i = 2; i <= sqrt(n); ++i){
        if(n % i == 0)  return false;
    }
    return true;
}

ll b[10000]={5,7,11};
int p[8]={4,2,4,2,4,6,2,6};
bool prime(int n){
    int i = 7, j, q;
    if(n == 1)  return false;
    if(n == 2 || n == 5 || n == 3)  return true;
    if(n % 2 == 0 || n % 3 == 0 || n % 5 == 0)  return false;
    q = (int)sqrt((double)n);
    for(; i <= q; ){
        for(j = 0; j < 8; ++j){
            if(n % i == 0)  return false;
            i += p[j];
        }
        if(n % i == 0)  return false;
    }
    return true;
}
int creat(){
    int i, j, k, l, m, count = 3;
    for(i = 1; i <= 9; i += 2)
        for(j = 0; j <= 9; ++j)
            b[count++] = 100 * i + 10 * j + i;
    for(i = 1; i <= 9; i += 2)
        for(j = 0; j <= 9; ++j)
            for(k = 0; k <= 9; ++k)
              b[count++] = 10000 * i + 1000 * j + k * 100 + j * 10 + i;
        for(i = 1; i <= 9; i += 2)
         for(j = 0; j <= 9; ++j)
            for(k = 0; k <= 9; ++k)
                for(l = 0; l <= 9; ++l)
                  b[count++] = 1000000 * i + 100000 * j + k * 10000 + l * 1000 + k * 100 + j * 10 + i;
        return count - 1;
}

int main() {
    ofstream fout ("pprime.out");
    ifstream fin ("pprime.in");
    int i, j, k, t, n, s, c, w, q;
    int a;
    n = creat();
    fin >> a >> c;
    for(i = 0; i < n; ++i){
        if(b[i] >= a){
            if(b[i] > c) break;
            if(prime(b[i])){
                fout << b[i] << endl;
            }
        }
    }

    fin.close();
    fout.close();
    return 0;
}
原文地址:https://www.cnblogs.com/wushuaiyi/p/4264229.html