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

转载于:https://www.cnblogs.com/rolyxiao/archive/2012/07/17/2596465.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值