分拆素数和,悲剧,写出来测试数据通过了,但提交时显示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 ;
}
#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 " );
}
#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