您的位置:首页 > 大数据 > 人工智能

USACOTrainning.Prime Palindromes

2010-04-13 20:19 253 查看
题目大意是给两个整数a,b,然后求出这之间的所有回文素数。

枚举回文的数,其实枚举回文的数加上判断宿舍的时间不是很长的。

#include <iostream>
#include <string>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <time.h>
#include <queue>
#include <set>
using namespace std;

vector<int>ans;

int num[8];

bool check(int val)
{
for(int i = 2; i <= sqrt(val * 1.0); i++)
{
if(val % i == 0)  return false;
}
return true;
}

void dfs(int i, int len)
{
if(i == len)
{
int val = 0;
for(int j = 0; j < 2 * len; j++)
{
if(j < len)  val = val * 10 + num[j];
else  val = val * 10 + num[2 * len - 1 - j];
}
if(check(val))  ans.push_back(val);
return;
}

if(i == 0)
{
for(int j = 1; j <= 9; j += 2)
{
//if(j == 5)  continue;
num[i] = j;
dfs(i + 1, len);
}
}
else
{
for(int j = 0; j <= 9; j++)
{
num[i] = j;
dfs(i + 1, len);
}
}
}

void ddfs(int i, int len)
{
if(i == len)
{
int val = 0;
for(int j = 0; j < 2 * len - 1; j++)
{
if(j < len)  val = val * 10 + num[j];
else  val = val * 10 + num[2 * len - 2 - j];
}
if(check(val))  ans.push_back(val);
return;
}

if(i == 0)
{
for(int j = 1; j <= 9; j += 2)
{
//if(j == 5)  continue;
num[i] = j;
ddfs(i + 1, len);
}
}
else
{
for(int j = 0; j <= 9; j++)
{
num[i] = j;
ddfs(i + 1, len);
}
}
}

void ready()
{
for(int i = 1; i <= 8; i++)
{
if(i % 2 == 0)  dfs(0, i / 2);
else  ddfs(0, i / 2 + 1);
}
}

int main()
{
freopen("pprime.in", "r", stdin);
freopen("pprime.out", "w", stdout);

ready();
sort(ans.begin(), ans.end());
int a, b, res = 0;
scanf("%d%d", &a, &b);
for(int i = 0; i < ans.size(); i++)
{
if(ans[i] >= a && ans[i] <= b)  printf("%d\n", ans[i]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: