您的位置:首页 > 其它

USACO Prime Palindromes 构造回文数

2015-01-31 16:06 423 查看
这道题目一点也不卡素数的判断

就是朴素的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: