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

题目

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";        
    }
}

猜你喜欢

转载自blog.csdn.net/h928066986/article/details/75225569