C++ 牛客网普及组第二次测试B

链接:https://www.nowcoder.com/acm/contest/165/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

牛牛最近学习了质数的概念。
质数指在大于1的自然数中,除了1和它本身以外不再有其他因数。
输入一个n,输出小于等于n最大的质数。

输入描述:

输入一个整数n

输出描述:

输出小于等于n的最大的质数
示例1

输入

复制
2

输出

复制
2
示例2

输入

复制
100

输出

复制
97

备注:

对于所有数据: 2 <= n <= 1000000000000
30分: n <= 100000
70分: n <= 1000000000


看起来,明显是水题一道,可是,大家如果想要拿满100分的话,大家就需要注意一下数据范围,就在上方。
大家可以发现,如果我们只是用平常的方法来解决这一个问题的话是明显不行的。
我们需要对我们的方法进行一次完善,以应对这道题的数据(以后也可以用)。
1.开long long 不必多说。
2.因为题目要求是输出小于等于n最大的质数,所以我们只需要从这个数开始循环,直到2(因为1并没有什么作用,1并不是素数)。这样就可以减少计算,减少时间的浪费。
3.在判断素数的时候,只需要判断在sqrt(n)之前的数,这样也可以减少时间(sqrt()是开方的意思。为什么只需要前面的数,道理大家想一想就知道了)。
4.在判断素数的函数中,为了节省时间,我们可以在发现这个数可以被某个数(不为1和它本身)整除的时候,直接返回0,(代表着不行,也可以用bool类型的false)。
如果一直没有找到,便可以在循环的外侧返回1(也就是bool类型的true)。


重点就是这些,主要是节省时间,防止时间超限!!!!!!

#include<bits/stdc++.h>
using namespace std;
long long  n;
int ss(long long  x)
{
    int flag=0;
    long long h=sqrt(x);
    for(long long i=2;i<=h;i++)
    {
        if(x%i==0)
        {
            flag=1;
            return 0;
        }
    }
    return 1;
}
int main()
{
    cin>>n;
    for(long long int i=n;i>=2;i--)
    {
         if(ss(i)==1)
        {
            cout<<i;
            return 0;
        }
    }
}

 

posted @ 2018-09-16 20:08  FXY_ssf  阅读(302)  评论(0编辑  收藏  举报