usaco Prime Palindromes

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

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

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

/*
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; }

  

转载于:https://www.cnblogs.com/modengdubai/p/4768176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值