PAT乙级1007 素数对猜想 (20 分)

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级1007 素数对猜想 (20 分)相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
https://pintia.cn/problem-sets/994805260223102976/problems/994805317546655744

方法一: 暴力写法

#include<iostream>
#include<cstdio>
using namespace std;
bool a[100015]={false};
int main(void)
{
    int N;
    cin>>N;
    int i,j;
    int count=0;
    for(i=2;i<=N;i++)//找到N以内的素数
    {
        if(a[i]==false)
        for(j=2;j<=N;j++)
        {
            if(j*i<=N)
                a[j*i]=true;//把不是素数的标记为true
            else
                break;
        }
    }
    for(i=2;i<N;i++)
    {
        if(a[i]==false)//找到第一个素数
        for(j=i+1;j<=N;j++)
        {
            if(a[i]!=true && a[j] != true )//找到第二个素数
            {
                if( (j-i) == 2 )
                   count++;
                break;
            }
        }
    }
    printf("%d\\n",count);
    return 0;
}

方法二: 优化写法+ 埃氏筛法

#include<cstdio>
#include<iostream>
using namespace std;
int ans=0;
int n;
int a[100005];
void print()
{
	for(int i=2;i<=n;i++)
	{
		if(!a[i])
		for(int j=i+i;j<=n;j=j+i) a[j]=true;
	}
}
int main(void)
{
	cin>>n;
	print();
	for(int i=2;i<=n-2;i++)
	{
		if(!a[i]&&!a[i+2]) ans++;
	}
	cout<<ans<<endl;
	return 0;
}

方法三: 线性筛

#include<cstdio>
#include<iostream>
using namespace std;

int ans=0;
int n;
int a[100005];
int primes[100005],cnt;
void print()
{
	for(int i=2;i<=n;i++)
	{
		if(!a[i]) primes[cnt++]=i;
		for(int j=0;primes[j]<=n/i;j++) 
		{
			a[primes[j]*i]=true;
			if(i%primes[j]==0) break;
		}
	}
}
int main(void)
{
	cin>>n;
	print();
	for(int i=2;i<=n-2;i++)
	{
		if(!a[i]&&!a[i+2]) ans++;
	}
	cout<<ans<<endl;
	return 0;
}

以上是关于PAT乙级1007 素数对猜想 (20 分)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA1007 素数对猜想 (20分) PAT乙级 PAT (Basic Level) Practice (中文)

PAT乙级1007

PAT乙级1007.素数对猜想(20)

PAT乙级1007

PAT乙级.1007.素数对猜想 (20)

1007 素数对猜想 (20 分)