满分最优解法:1007 素数对猜想 (20分)

立志用更少的代码做更高效的表达


Pat乙级最优化代码+题解+分析汇总——>传送门


让我们定义dn
​​ 为:dn=pn+1​−pn,其中pi是第i个素数。显然有d1=1,且对于n>1有d​n是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。

输入格式:
输入在一行给出正整数N。

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

输入样例:
20
输出样例:
4


解题思路

本题的核心考点为:筛选法求某一区间的素数。

说明:筛选法可求某一数字区间的所有数字是否为素数, 且时间复杂度极低。

应用场景: 打表。 事先定义数组,利用筛选法,求得该数组所有数字下标是否为素数。 为接下来的判断操作做准备。

理解筛选法后, 本体就很好做了, 只需要判断是否差值为2即可。


代码展示

#include<iostream>
#include<cmath>
#define Max 100005
using namespace std;
int a[Max];

void Sifting() {			//筛选法求素数
	a[1] = a[0] = 1;
	for(int i = 2; i < sqrt(Max); i++) 
		if(a[i] == 0) 
			for(int j = i*2; j <= 100005; j+=i) 
				a[j] = 1;
}

int main() {
	Sifting();
	int n; cin>>n;
	//sum记录上一个质数,与这个质数比较是否差值为2; num代表差值为2素数对的个数 
	int sum = 3, num = 0;		 
	for(int i = 0; i <= n; i++) 
		if(a[i] == 0) {
			if(i-sum==2) num++; 
			sum = i;
		}
	cout << num << endl; 
return 0; }

每日一句

惟正己可以化人,唯尽己可以服人。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页