美文网首页
腾讯2017秋招秋招笔试编程题-----3

腾讯2017秋招秋招笔试编程题-----3

作者: 王伯庸 | 来源:发表于2018-09-20 13:51 被阅读0次

    题目描述

    • 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
      如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))*

    思路描述

    这个问题比较重要的点在于如何判断一个数是否是素数

    如何判断一个数是否是素数呢?

    第一种方法

    设输入值为num。

    for i=2 to num-1
    
      if(num%i==0)
    
        return false;
    
    return true;
    

    方法一时间复杂度为O(n).

    第二种方法

    for i=2 to sqrt(num)
    
      if(num%i==0)
        return false;  
    return true;
    

    时间复杂度为O(log2N)

    最后给出代码如下,由于没有找到原文出处,对原作者表示歉意,侵删。

    #include<iostream>
    #include<cmath>
    #include<string>
    using namespace std;
    bool is_Prime(int num)
    {
        if(num==2||num==3)
            return true;
        if (num%6!=5&&num%6!=1)
            return false;
        int num1=sqrt(num);
        for(int i=5;i<=num1;i+=6)
        {
            if(num%i==0||num%(i+2)==0)
                return false;
        }
        return true;
    }
    int main()
    {
        int number;
        int sum=0;
        cin>>number;
        for(int i=2;i<=number/2;i++)
        {
            if(is_Prime(i)&&is_Prime(number-i))
                sum++;
        }
        cout<<sum<<endl;
    }
    
    

    这个方法比较难以想通的是为什么primer函数中,最后判断6X两侧的数是否是质数。事实上通过前两步的过滤,数字空间只剩下了这两种数,其他的数字都被过滤掉了。因为只需要判断在这些数字就足够了。

    相关文章

      网友评论

          本文标题:腾讯2017秋招秋招笔试编程题-----3

          本文链接:https://www.haomeiwen.com/subject/bizgnftx.html