nyoj26-孪生素数问题

孪生素数问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14
样例输出
4
 
#include <iostream>  
#include <cstring>  
#include <cmath>  
   
using namespace std;  
   
int a[1000000];  
   
void isPrime(int number)  
{  
    int i,j;  
    for(i=1;i<=number;i++)  
        if(i%2)  
            a[i]=1;  
           
    for(i=3;i<=sqrt(number);i+=2)  
        if(a[i])  
        {  
            for(j=i*2;j<=number;j+=i)  
                a[j]=0;  
        }  
}  
   
int main()  
{  
    int n,m,i,count;  
    cin>>n;  
    while(n--)  
    {  
        cin>>m;  
        memset(a,0,sizeof(a));  
        count=0;  
        isPrime(m);  
        for(i=2;i<=m-2;i++)           
            if(a[i] && a[i+2])    //判断是否为素数  
                count++;  
        if(m>=3)  
            count++;  
               
        cout<<count<<endl;  
    }  
    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;
}        

原文地址:https://www.cnblogs.com/aerer/p/9931106.html