usaco1.5.2(pprime)

这个题目做完,就正式结束Chapter 1的内容进入2了,心情大爽,就是赶脚速度有点太慢了。

题目:

Prime Palindromes

The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .

PROGRAM NAME: pprime

INPUT FORMAT

Line 1: Two integers, a and b

SAMPLE INPUT (file pprime.in)

5 500

OUTPUT FORMAT

The list of palindromic primes in numerical order, one per line.

SAMPLE OUTPUT (file pprime.out)

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

提议就是说求A,B之间的回文素数
代码:
/*
ID:614433244
PROG: pprime
LANG: C++
*/

#include"iostream"
#include"cstdio"
#include"cmath"
using namespace std;
bool isp( int p )//еп╤о╩ьндйЩ
{
    if( p==2 )
        return true;
    if( p==3 )
        return true;
    int i;
    for( i=3;i<=sqrt( p )+1;i+=2 )
        if( p%i==0 )
            return false;
    return true;
}
void solve( int a,int b )
{
    int ans;
    int i,j,k,l;
    if( a<=3&&3<=b )
        printf("3\n");
    if( a<=5&&5<=b )
        printf("5\n");
    if( a<=7&&7<=b )
        printf("7\n");
    if( a<=2&&2<=b )
        printf("2\n");
    if( a<=11&&11<=b )
        printf("11\n");
    for( i=1;i<=9;i++ )//3位数
    {
        if( i==2||i==4||i==5||i==6||i==8 )
            continue;
        if( a>999||b<100 )
            break;
        for( j=0;j<=9;j++ )
        {
            ans=101*i+j*10;
            if( isp(ans)&&ans<=b&&ans>=a )
                printf("%d\n",ans);
            if( ans>=b )
                return;
        }
    }
    for( i=1;i<=9;i++ )//5位数
    {
        if( i==2||i==4||i==5||i==6||i==8 )
            continue;
        if( a>99999||b<10000 )
            break;
        for( j=0;j<=9;j++ )
            for( k=0;k<=9;k++ )
            {
                ans=10001*i+1010*j+100*k;
                if( isp(ans)&&ans<=b&&ans>=a )
                    printf("%d\n",ans);
                if( ans>=b )
                    return;
            }
    }
    for( i=1;i<=9;i++ )//7
    {
        if( i==2||i==4||i==5||i==6||i==8 )
            continue;
        if( a>9999999||b<1000000 )
            break;
        for( j=0;j<=9;j++ )
            for( k=0;k<=9;k++ )
                for( l=0;l<=9;l++ )
                {
                    ans=1000001*i+100010*j+10100*k+1000*l;
                    if( isp(ans)&&ans<=b&&ans>=a )
                        printf("%d\n",ans);
                    if( ans>=b )
                        return;
                }
    }
}
int main()
{
    freopen("pprime.in","r",stdin);
    freopen("pprime.out","w",stdout);
    int a,b;
    scanf("%d%d",&a,&b);
    solve(a,b);
    return 0;
}

这道题目让我赶脚到了把代码写在main外面的好处那就是可以在必要时直接return,这样可以少做不少的比较!

posted @ 2012-07-23 10:45  萧若离  阅读(173)  评论(0)    收藏  举报