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

素数对猜想(题目作者:陈越 浙江大学)

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

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

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例:

20

输出样例:

4


首先什么是素数对?

质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数


我们可以用最基本的遍历方法:

bool primes(int k)
{
	int count=1;
	for (int i = 2; i <= k; i++)
	{
		if (k%i == 0)
		{
                        ++count;
                        if(count>2)
			return false;
		}
	}
		return true;
}

但是这样每一个数字去除很慢不是吗?

所以k不必被2~k-1之间的每一个整数去除,只需被2~√k之间的每一个整数去除以了。如果k不能被2~√k间任一整数除,k必定是素数。如判别17是是否为素数,只需使17被2~4之间的每一个整数去除由于都不能整除,可以判定17素数。(原因:因为如果k能被2~k-1之间任一整数整除,其二个因子必定有一个小于或等于√k,另一个大于或等于√k。例如16能被2,4,8除,16=2*8,2小于4,8大4,16=4*4,4=√16,因此只需判定在2~4之间有无因子即可)

扫描二维码关注公众号,回复: 549790 查看本文章

以下给出C++解决方案:

#include <iostream>
#include <cmath>
using namespace std;
bool Primenum(int n)
{
	for (int i = 2; i <=sqrt(n); i++)
		if (n%i == 0)
			return false;
	return true;
}
int main()
{
	int n,sum=0;
	int re = 0;
	int prime[100000] = {0};
	cin >> n;
	for (int i = 1; i <= n; i++)
		if (Primenum(i))
		{
			prime[sum] = i;
			sum++;
		}
	for (int i = 0; i < sum-1; i++)
		if (prime[i + 1] - prime[i] == 2)
			re++;
	cout << re;
	return 0;
}

内容原创,转载请注明出处

猜你喜欢

转载自blog.csdn.net/yuquan87/article/details/79913603
今日推荐