PAT乙级(Basic)题库---1007

来源:互联网 发布:centos git 编译 编辑:程序博客网 时间:2024/05/17 02:59

题目

1007-素数对猜想

解题思路

根据输入的数,遍历判断小于它的奇数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";            }}
原创粉丝点击