C++ 牛客网普及组第二次测试B
链接:https://www.nowcoder.com/acm/contest/165/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
牛牛最近学习了质数的概念。
质数指在大于1的自然数中,除了1和它本身以外不再有其他因数。
输入一个n,输出小于等于n最大的质数。输入描述:
输入一个整数n
输出描述:
输出小于等于n的最大的质数
备注:
对于所有数据: 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; } } }