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

2018-09-20  本文已影响0人  王伯庸

题目描述

思路描述

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

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

第一种方法

设输入值为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两侧的数是否是质数。事实上通过前两步的过滤,数字空间只剩下了这两种数,其他的数字都被过滤掉了。因为只需要判断在这些数字就足够了。

上一篇 下一篇

猜你喜欢

热点阅读