99网
您的当前位置:首页PAT (Basic Level) Practice 1007 素数对猜想 (20分) 非暴力循环,6倍临近素数快速解法

PAT (Basic Level) Practice 1007 素数对猜想 (20分) 非暴力循环,6倍临近素数快速解法

来源:99网

本文相对于大部分采用暴力循环,对每个数进行求素数的方法不同,采用了素数分布规律思想达到减少时间复杂度的目的。

#include <bits/stdc++.h>
using namespace std;

bool isPrime(int n)
{	//返回1表示判断为质数,0为非质数,在此没有进行输入异常检测
	float n_sqrt;
	if(n==2 || n==3) return true;
	if(n%6!=1 && n%6!=5) return false;
	n_sqrt=floor(sqrt((float)n));
	for(int i=5;i<=n_sqrt;i+=6)
	{
	    if(n%(i)==0 | n%(i+2)==0) return false;
	}
        return true;
}
int main()
{
    int n;
    int total=0;
    cin>>n;
    if(n>5){
        total++;
        int a = n/6;
        for(int i =1;i<=a;i++){
            if(isPrime(6*i-1)&&isPrime(6*i+1)&&(6*i+1<=n)){
                total++;
            }
        }
    }
    else{
        if(n==5){
            total=1;
        }
    }
    cout<<total<<endl;
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容