USACO-Section1.6 Prime Palindromes(素数和回文数)

2017-8-3

题目描述

求出给定范围内的质数回文数

解答

先求出回文数再判断是否为给定区间的质数

代码

/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;

ifstream fin("pprime.in");
ofstream fout("pprime.out");

const int N = 1000;
long x[N+1];
int cnt=0;
long a,b;

bool is_prime(long n){ //判断是否为给定区间的质数
   if (nb){
       return false;
   }
   if (n==0||n==1) return false;
   if (n==2||n==3) return true;
   long i;
   for (i=2;i<=sqrt(n);i++){
      if (n%i==0) return false;
   }
   return true;
}

void hui_8(){ //八位回文数 
    int x1,x2,x3,x4;
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            for (x3=0;x3<=9;x3++){
                for (x4=0;x4<=9;x4++){
long n=(x1*1000+x2*100+x3*10+x4)*10000+x4*1000+x3*100+x2*10+x1;
                    if (is_prime(n)) fout<void hui_7(){
    int x1,x2,x3,x4;
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            for (x3=0;x3<=9;x3++){
                for (x4=0;x4<=9;x4++){
        long n=(x1*1000+x2*100+x3*10+x4)*1000+x3*100+x2*10+x1;
                    if (is_prime(n)) fout<void hui_6(){
    int x1,x2,x3;
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            for (x3=0;x3<=9;x3++){
                long n=(x1*100+x2*10+x3)*1000+x3*100+x2*10+x1;
                if (is_prime(n)) fout<void hui_5(){
    int x1,x2,x3; 
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            for (x3=0;x3<=9;x3++){
                long n=(x1*100+x2*10+x3)*100+x2*10+x1;
                if (is_prime(n)) fout<void hui_4(){
    int x1,x2;
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            long n=(x1*10+x2)*100+x2*10+x1;
            if (is_prime(n)) fout<void hui_3(){
    int x1,x2;
    for (x1=1;x1<=9;x1+=2){
        for (x2=0;x2<=9;x2++){
            long n=(x1*10+x2)*10+x1;
            if (is_prime(n)) fout<void hui_2(){
    int x1;
    for (x1=1;x1<=9;x1+=2){
        long n=x1*10+x1;
        if (is_prime(n)) fout<void hui_1(){
    for (int i=2;i<=9;i++){
        if (is_prime(i)) fout<int main(){
    cnt=0;
    fin>>a>>b;
    hui_1();
    hui_2(); 
    hui_3(); 
    hui_4(); 
    hui_5(); 
    hui_6();
    hui_7(); 
    hui_8();
    return 0;
}

1.回文数比较少,那么我们可以先判断回文数再判断素数
2.我们可以枚举区间内所有的数,如果是回文数的话就再判断是否为素数,但是这个在第七个测试数据的时候就已经超时了。
3.那么我们最后的选择就是自己构建回文数。

/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;

ifstream fin("pprime.in");
ofstream fout("pprime.out");

typedef long long ll;
ll a,b;

bool ispal(ll n){
    int x[10],cnt=0;
    while (n){
        x[cnt++]=n%10;
        n/=10;
    }
    if (cnt==1) return true;
    for (int i=0;i2;i++){
        if (x[i]!=x[cnt-i-1]) return false;
    }
    return true;
}

int main(){
    while (fin>>a>>b){
        ll i,j;
        for (i=a;i<=b;i++){
            if (ispal(i)){
                for (j=2;j*j<=i;j++){
                    if (i%j==0) break;
                }
                if (j*j>i) fout<return 0;
}

上面的是超时的代码。。。

它给的提示是枚举所有的回文数(不是暴力枚举,而是自己构建),然后再判断即可,这里需要注意的是:我们可以在is_prime函数里面判断是否在给定a到b区间内,这样可以省去很多判断。

/*
ID: 18795871
PROG: pprime
LANG: C++
*/
#include
#include
#include
using namespace std;

ifstream fin("pprime.in");
ofstream fout("pprime.out");

typedef long long ll;
const int N = 10;
ll a,b;
int i,j,k,t;

bool isprime(ll n){
    if (n>b||nreturn false; 
    for (int i=2;i*i<=n;i++){
        if (n%i==0) return false;
    }
    return true;
}

void pal1(){
    for (i=1;iif (isprime(i)){
            fout<for (i=1;iif (isprime(i*10+i)){
            fout<<(i*10+i)<for (i=1;ifor (j=0;jif (isprime(i*100+j*10+i)){
                fout<<(i*100+j*10+i)<for (i=1;ifor (j=0;jif (isprime((i*10+j)*100+j*10+i)){
                fout<<((i*10+j)*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kif (isprime((i*100+j*10+k)*100+j*10+i)){
                    fout<<((i*100+j*10+k)*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kif (isprime((i*100+j*10+k)*1000+k*100+j*10+i)){
                    fout<<((i*100+j*10+k)*1000+k*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kfor (t=0;tif (isprime((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)){
                        fout<<((i*1000+j*100+k*10+t)*1000+k*100+j*10+i)<for (i=1;ifor (j=0;jfor (k=0;kfor (t=0;tif (isprime((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)){
                        fout<<((i*1000+j*100+k*10+t)*10000+t*1000+k*100+j*10+i)<int main(){
    while (fin>>a>>b){
        pal1();
        pal2();
        pal3();
        pal4();
        pal5();
        pal6();
        pal7();
        pal8();
    }
    return 0;
}

你可能感兴趣的:(USACO)