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) 编辑 收藏 举报