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

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

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),只用了常数空间。
全部评论

相关推荐

06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
07-01 13:37
门头沟学院 Java
steelhead:不是你的问题,这是社会的问题。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:30
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务