码迷,mamicode.com
首页 > 其他好文 > 详细

usaco Prime Palindromes

时间:2015-08-29 00:49:04      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

给定两个边界,求输出所有这个边界以内,既是素数又是回文的数字;

一开始用的素数筛,爆内存了。

改为生成回文后检测是否为素数,在如何递归生成回文上卡了很久。一直纠结于边界情况的处理。

/*
ID: modengd1
PROG: pprime
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <math.h>
using namespace std;
typedef long long ll;
long long A,B;

bool IsPrime(int x)
{
    if(x==2)
        return true;
    if(x%2==0)
        return false;
    for(int i=3;i*i<=x;i++)
    {
        if(x%i==0)
            return false;
    }
    return true;
}
void slove(int deep,int limit,int fro,int tair)//deep为当前回文串的长度,limit为要求的回文串的长度,fro为生成的回文串的前半部分,tair为后半部分,当前后不一样长时将中间的数字划分到前半部分
{
    int ans;
    if(deep==limit)
    {
        ans=fro*pow(10,(deep/2))+tair;
       if(ans<A||ans>B)//检查是否超出边界 return; if(IsPrime(ans)) { cout<<ans<<endl; } return; } if((limit-deep)==1)//如果需要求的回文串长度为奇数,且已经生成了除最中间的数字以外的前后两部分之后 { for(int i=fro==0?1:0;i<10;i++) { slove(deep+1,limit,fro*10+i,tair); } } else//给fro的末尾加一个数字,给tair的前面加相同的数字 { for(int i=fro==0?1:0;i<10;i++) { slove(deep+2,limit,fro*10+i,pow(10,(deep/2))*i+tair); } } } int main() { freopen("pprime.in","r",stdin); freopen("pprime.out","w",stdout); cin>>A>>B; int st,en;
  //得出边界的位数 for( st=0;A>pow(10,st);st++); for( en=0;B>pow(10,en);en++); for(int i=st;i<=en;i++) { slove(0,i,0,0); } return 0; }

  

usaco Prime Palindromes

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4768176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!