USACO-Section1.5 Prime Palindromes【暴力枚举】

来源:互联网 发布:毛笔字生成软件 编辑:程序博客网 时间:2024/05/21 09:39

题目描述:

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;(翻译来源:NOCOW)

INPUT FORMAT:

(file pprime.in)
第 1 行: 二个整数 a 和 b .

OUTPUT FORMAT:

(file pprime.out)
输出一个回文质数的列表,一行一个。


SAMPLE INPUT

5 500


SAMPLE OUTPUT

5
7
11
101
131
151
181
191
313
353
373
383


解题思路:

借鉴题目给的思想,枚举回文数再计算(如果用筛法空间占用太大)。偶数回文数能被11整除(注意11符合),下面是代码。

#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>int ans[100010],count=0;int fun(int a){//判断素数    int i;    for(i=2;i<=sqrt(a);i++){        if(a%i==0)return 0;    }    return 1;}int main(){    FILE *fin  = fopen ("pprime.in", "r");    FILE *fout = fopen ("pprime.out", "w");    int a,b;    fscanf(fin,"%d%d",&a,&b);    int i,a1,a2,a3,a4,flag=0,flag1=0;//flag判断是否大于b,flag1判断11是否添加过了    for(a1=0;a1<=9;a1++){//4重循环~        if(flag==1)break;        for(a2=0;a2<=9;a2++){            if(flag==1)break;            for(a3=0;a3<=9;a3++){                if(flag==1)break;                for(a4=0;a4<=9;a4++){                    int temp;                    if(a1){temp=a1*1000000+a2*100000+a3*10000+a4*1000+a3*100+a2*10+a1;}                    else if(a2){temp=a2*10000+a3*1000+a4*100+a3*10+a2;}                    else if(a3){                    if(b>=11&&flag1==0){//将b添加到ans数组,注意限制条件,只添加一次                    if(a<=11)                    ans[count++]=11;                    flag1=1;                    }                    temp=a3*100+a4*10+a3;}                    else temp=a4;                     if(temp>b){//如果大于b就退出循环                    flag=1;                    break;                    }                    else if(fun(temp)&&temp>=a)//如果大于a且是素数就添加                           ans[count++]=temp;                }            }        }    }    for(i=0;i<count;i++){        fprintf(fout,"%d\n",ans[i]);    }    exit(0);}
阅读全文
1 0
原创粉丝点击