题目
解题思路
根据输入的数,遍历判断小于它的奇数n是否为素数,若n为素数,判断n-2是否是素数,若是则计数加一,最后输出素数对个数。由于唯一的偶素数2不会组成素数对,不用特殊考虑。所以这题重点在于素数的判断。
素数的判断
众所周知,一个数除它本身和一以外没有其他约数则称其为素数(或质数),因此最简单直接的方法就是遍历除一外小于它的数,看是否能被其整除。一种改进是遍历除一外小于它的奇数以及二,看是否能被其整除。另一种改进是遍历除一外小于a的奇数以及二,看是否能被整除,其中a*a是小于等于该数的最大平方数。
第一种改进好理解,我们来解读下第二种改进。一个数x,如果它不是素数,则能表示成x=n*m,其中n小于等于m,由于a*a是小于等于x的最大平方数,因此n*n小于等于a*a。所以一个数如果不是素数,一定能在小于等于a的范围内找到它的约数n。反之如果在此范围内找不到它的约数,则该数为素数。
代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cmath>
using namespace std;
//判断是否是素数
bool isPrime(int num)
{
if(num==2)
{
return true;
}
else if(num==1||num%2==0)
{
return false;
}
else
{
//遍历小于等于a的奇数,是否能被整除,其中a=sqrt(num)
for(int i=3;i<=sqrt(num);i+=2)
{
if(num%i==0)
{
return false;
}
}
return true;
}
}
int main()
{
int n,sum;
while(cin>>n)
{
//sum记录素数对的个数
sum=0;
//得到小于n的最大奇数
if(n%2==0)
{
n=n-1;
}
for(int i=n;i>2;i-=2)
{
//判断是否是素数对
if(isPrime(i))
{
if(isPrime(i-2))
{
sum++;
}
}
}
cout<<sum<<"\n";
}
}