PTA1007 素数对猜想

让我们定义d​n为:dn=pn+1−p​n,其中pi是第i个素数。显然有d1=1,且对于n>1有d​n​​ 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10^5 ),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。

输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

解析:
1.如何得到素数

> 对依次所得数字进行判断
> bool isnum(int n)
> {
> 		if(n==1) return false;
> 		if(n==2) return true;
> for(int i=2;i<n;i++)
> {
> 		if(n%i==0) return true;
> } 
> return false;}

方法一:正常运行但未能通过第五个测点(超时)

#include<iostream>
using namespace std;

int isnum(int n)
{
    for(int i=2;i<n;i++)
    {
        if(n%i==0)return true;
    }
    return false;
}

int main()
{
    int n;
    cin>>n;
    int d,p0,p1,count;
    p0=2;
    p1=3;
    count=0;
    for(int i=4;i<=n;i++) {
        if(isnum(i)==false){
            p0=p1;
            p1=i;
            if(p1-p0==2)
            { count++;}} }
    cout<<count;
}

改进:
1.大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等。反之不成立,例如25 49
2.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数;并且大于2的偶数都不是素数
answer:

#include<iostream>
#include<math.h>
using namespace std;

int isnum(int n)
{
    int k=sqrt(n);
    for(int i=2;i<=k;i++)//等号别少!!!
    {
        if(n%i==0)return true;
    }
    return false;
}

int main()
{
    int n;
    cin>>n;
    int d,count;
    if(n>=5)
    count=1;
    else count=0;
    for(int i=6;i<=n-1;i=i+6)
    {
        if(isnum(i+1)==false&&isnum(i-1)==false)
        {
            count++;
        }
    }
    cout<<count;
}

在这里插入图片描述结果biu!

猜你喜欢

转载自blog.csdn.net/weixin_44916213/article/details/111362911