给大家比较下
孪生素数问题时间限制:3000 ms | 内存限制:65535 KB
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14
一下是三个算法:
算法一:
#include "stdio.h"
#include "math.h"
int main()
{
int n,m;
bool isprime(int n);
scanf("%d",&n);
while(n--)
{
int count=0,i=3;
scanf("%d",&m);
if(m>2)count++;
while(i<=m-2)
{
if(isprime(i)&&isprime(i+2))count++;
i=i+2;
}
printf("%d",count);
}
return 0;
}
bool isprime(int n)
{
if(n < 2) return false;
for(int i =2; i<=sqrt(n); ++i)
if(n%i == 0) return false;
return true;
}
算法二:
#include<stdio.h>
#include<math.h>
int a[1000005];
int main()
{
int is_prime(int n);
int i,j,n;
for(i=2,j=0;i<1000005;i++)
{
if(is_prime(i))
{
a[j]=i;
j++;
}
}
scanf("%d",&n);
while(n--)
{
int m,p,q,count=0;
scanf("%d",&m);
if(m==0||m==1)
{
printf("0\n");
continue;
}
for(i=1;a[i]<=m;i++)
{
if((a[i]-a[i-1]==1)||(a[i]-a[i-1]==2))
count++;
}
printf("%d\n",count);
}
return 0;
}
int is_prime(int n)
{
int flag=0,i;
if(n==1||n<=0)
return 0;
else
{
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=1;
break;
}
}
if(!flag)
return 1;
else
return 0;
}
}
算法三:
#include <iostream>
#include<math.h>
using namespace std;
bool vis[1000010];
int main()
{
int n=1000010;
int m =sqrt(n+0.5);
int c=0;
for(int i =2;i<=m;i++)
if(!vis[i])
{
for (int j = i*i;j<=n;j+=i)
vis[j]=1;
}
cin>>n;
while(n--)
{
int count=0,m;
cin>>m;
for(int i=3;i<m-1;i++)
{
if(!vis[i] && !vis[i+2]) count++;
}
if(m>3)
cout<<count+1<<endl;
else if(m==3) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
return 0;
}
看看算法的时间复杂度