usaco1.5.3(sprime)

题目:由于今晚usaco崩溃了,所以补贴题目了。大意是给一个N(1<=N<=8),从小到大输出所有满足条件的N位数。

条件:1,此N位数是素数。2,此N位数前面的都是素数。

例如:三位数233,是素数,去掉最后一位3,剩余23依然是素数,再去掉一位,剩余2还是素数。

看到题目感觉是dp,后面的由前面的添加转化而来,但是在想办法存储前面时出现了问题,不知道怎么下笔。最后直接用8个if暴力过掉了。后来看解题报告,根本无需记录,直接用递归算就行了,表示还是太嫩了,没经验。

代码:这么丑陋的代码不看也罢

看完解题报告,感到无比汗颜,直接递归写,不用存储N-1位,代码估计只有40行左右。

今早起来,回想了官方结题报告的过程,自己用dp思路是这写了下,过了:

代码:

/*
ID:614433244
PROG: sprime
LANG: C++
*/

#include"iostream"
#include"cstdio"
#include"cmath"
using namespace std;
bool isp( int t )
{
    if( t==2 )
        return true;
    if( t==3 )
        return true;
    if( t>3 )
    {
        int i;
        for( i=3;i<=sqrt(t)+1;i+=2 )
            if( t%i==0 )
                return false;
        return true;
    }
}
void f( int n,int k )
{
    if( k==1&&isp(n) )
    {
        printf("%d\n",n);
        return;
    }
    else
    {
        n=n*10;
        if( isp( n+1 ) )
            f( n+1,k-1 );
        if( isp(n+3) )
            f( n+3,k-1 );
        if( isp( n+7 ) )
            f( n+7,k-1 );
        if( isp(n+9) )
            f( n+9,k-1 );
    }
}
int main()
{
    freopen("sprime.in","r",stdin);
    freopen("sprime.out","w",stdout);
    int n;
    scanf("%d",&n);
    f( 2,n );
    f(3,n);
    f(5,n);
    f(7,n);
    return 0;
}
posted @ 2012-07-17 22:01  萧若离  阅读(204)  评论(0编辑  收藏  举报