hdu 2098 分拆素数和 悲剧超时了。

分拆素数和,悲剧,写出来测试数据通过了,但提交时显示Time limit exceeded.....百度一下,打表就ok了(解题思路:打表打出10000以内素数)

两种方法:对比。。第一个是case 2.....时间多,内存少。。第一种方法效率高多了。。打表时,快。。。

case 1:

 

#include<stdio.h>
#include
<string.h>
#include
<stdlib.h>
#include
<math.h>
#define M 10001

void fun(int *prime)
{
int a,i,j,k;
for(i=4;i<=M;i=i+2)
prime[i]
=1;
a
=sqrt(M);
for(i=3;i<=a;i++)
for(j=i*i;j<=M;j=j+i)
{
if(prime[j]==1)
continue;
prime[j]
=1;
}
}
int main( )
{
int prime[M+1],A[M+1],i,j,k=0,m,n,count=0;
memset(prime,
0,sizeof(prime));
prime[
1]=1;
fun(prime);
for(i=2;i<M;i++)
{
if(prime[i]==0)
{
A[k
++]=i;
}
}
while(scanf("%d",&n)!=EOF,n)
{

for(i=0;i<k;i++)
{
m
=n-A[i];
if(m>0)
{
if(prime[m]==0&&A[i]!=m)
count
++;
}
else
break;

}
printf(
"%d\n",count/2);
count
=0;
}
//system("pause");
return 0;
}

case 2: 我用第二种方法做时,不断提示TIME limit exceeded....加了个循环遍历之后,呵呵,过了。。

#include<stdio.h>
#include
<stdlib.h>
#include
<math.h>
int main()
{
int n,A[10000],i,j,k=1,t=0;

A[
0]=2;
for(i=3;i<=10000;i++)
for(j=2;j<i;j++)
{
if(i%j==0)
break;
else
if((i%j!=0)&&(i==j+1))
{
A[k
++]=i;

}
}
while(scanf("%d",&n)!=EOF,n)
{


t
=0;
int p;
for(i=0;i<k;i++)
if(A[i]>n)
p
=i;
//int p=sqrt(n);
for(k=0;k<=p;k++)
for(j=k+1;j<=p;j++)
if(A[k]+A[j]==n)
t
++;
//t=0;
printf("%d",t);


printf(
"\n");
//k=1;
}
//system(
"pause");
}

找出2->N之间的所有质数有两种方法。。一种是用“筛子法”,另一种是从2->N检查,找出质数。

详细请况,请看高手之空间。。http://hi.baidu.com/redraiment/blog/item/948ce93d271164c39e3d620c.html

posted on 2011-03-30 01:09  more think, more gains  阅读(249)  评论(0编辑  收藏  举报

导航