题解 | #查找组成一个偶数最接近的两个素数#

查找组成一个偶数最接近的两个素数

http://www.nowcoder.com/practice/f8538f9ae3f1484fb137789dec6eedb9

题目的主要信息:

任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对。

方法一:

穷举。首先知道判断素数的方法,素数是指在大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数。判断一个数是否为素数用试除法,用各个数从小到大依次去除a,如果到某一个数正好整除,这个a就可以断定不是质数。

从2开始遍历所有小于n的数字i,如果i和n-i均为素数,判断他们之间的差值是否比min小,如果比min小的话,min更新为i和n-i的差值,即为abs(n-i-i),p更新为i;如果差值比min大,则不发生变化,继续往下遍历。当遍历结束后,p和n-p即为组成当前偶数最接近的两个素数。 alt 具体做法:

#include<iostream>
#include<math.h>

using namespace std;

bool isPrime(int n){//判断是否为素数
    for(int i=2;i<n;i++){
        if(n%i==0){//找到一个可以整除的数,说明n不是素数
            return false;
        }
    }
    return true;
}


int main(){
    int n;
    while(cin>>n){
        int min=n;//暂存最小的素数差值
        int p=0;//暂存差值最小的素数
        for(int i=2;i<n;i++){//从n/2开始遍历
            if(isPrime(i)&&isPrime(n-i)){//如果两个数均为素数则满足条件
                if(abs(n-i-i)<min){//更新min值
                    min=abs(n-i-i);
                    p=i;
                }
            }
        }
        cout<<p<<endl<<n-p<<endl;//输出两个素数
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n2)O(n^2),for循环的时间复杂度为O(n)O(n),每次判断是否为素数的函数isPrime的时间复杂度为O(n)O(n)
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:

对方法一进行优化,组成该偶数的值i和n-i分布在n/2的两侧,越靠近n/2,差值就越小,因此可以从n/2开始遍历,找到第一对组成n的素数就是最接近的素数。同时,如果x×y=nx\times y=n,那么x和y必定分布在n\sqrt n的两侧,因此isPrime可以优化为之需要遍历到n\sqrt n,避免后面的重复判断。

具体做法:

#include<iostream>
#include<math.h>

using namespace std;

bool isPrime(int n){//判断是否为素数
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0){//找到一个可以整除的数,说明n不是素数
            return false;
        }
    }
    return true;
}


int main(){
    int n;
    while(cin>>n){
        for(int i=n/2;i>=0;i--){//从n/2开始遍历
            if(isPrime(i)&&isPrime(n-i)){//如果两个数均为素数则满足条件
                cout<<i<<endl<<n-i<<endl;
                break;
            }
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(nn)O(n\sqrt n),for循环的时间复杂度为O(n)O(n),每次判断是否为素数的函数isPrime的时间复杂度为O(n)O(\sqrt n)
  • 空间复杂度:O(1)O(1),只用了常数空间。
全部评论

相关推荐

牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
霁华Tel:秋招结束了,好累。我自编了一篇对话,语言别人看不懂,我觉得有某种力量在控制我的身体,我明明觉得有些东西就在眼前,但身边的人却说啥也没有,有神秘人通过电视,手机等在暗暗的给我发信号,我有时候会突然觉得身体的某一部分不属于我了。面对不同的人或场合,我表现出不一样的自己,以至于都不知道自己到底是什么样子的人。我觉得我已经做的很好,不需要其他人的建议和批评,我有些时候难以控制的兴奋,但是呼吸都让人开心。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务