超时了。。。第一种写法。。我的换一种思路了。。
例程:
#include<iostream>
#include<math.h>
#include<time.h>
using namespace std;
bool justifyprime(int n)
{
if(n==1)
return false;
else if(n==2||n==3)
return true;
else
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return false;
}
return true;
}
}
int main()
{ time_t start=clock();
int num;
cin>>num;
while(num--)
{
int range,NUM=0;
cin>>range;
for(int i=2;i<=range;i++)
{
if(justifyprime(i)==true)
{
if(justifyprime(i+1)==true)
{
NUM++;
}
else if(justifyprime(i+2)==true)
{
NUM++;
i++;
}
}
}
cout<<NUM<<endl;
}
clock_t end=clock();
cout<<end-start<<endl;
}
第二次的算法:时间上还是没过。。。我勒个去
#include<iostream>
#include<stdio.h>
#include<math.h>
using namespace std;
bool justifyprime(int n)
{
if(n==2||n==3)
return true;
else
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0)
return false;
}
return true;
}
}
int main()
{
int num;
scanf("%d",&num);
while(num--)
{
int range,NUM=0,last=2;
scanf("%d",&range);
for(int i=3;i<=range;i++)
{
if(justifyprime(i)==true)
{
if((i-last)<=2)
NUM++;
last=i;
}
}
printf("%d\n",NUM);
}
}
例程:
#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;
}