您的位置:首页 > 其它

usaco1.5.3(sprime)

2012-07-17 22:01 246 查看
题目:由于今晚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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: