题解 | #啊,这居然是个质数#

啊,这居然是个质数

https://ac.nowcoder.com/acm/contest/65846/B

题目传送门

首先先看题,浓缩一下题目(本来题目就很短),就是输入一个数 ,输出表示 范围内的最大质数。

这道题主要考察的是循环,判断质数的函数的编写以及数据大了之后的时间复杂度问题。

分析完题目后开始写程序,先是定义变量和输入。

long long n;//不开 long long 见祖宗
cin>>n;

接着就是循环从 遍历到 ,这里就有两种写法,楼主都会展示出来。

for(long long i=n;i>=2;i--)
{
	//判断质数
}
while(n>=2)
{
	//判断质数
}

然后就是循环内部。

if(foo(i)==1)//foo()=>判断质数的函数
{
	cout<<i;
	break;
}

再然后就是编写判断质数的函数,先上代码,然后分析。

bool foo(long long n)
{
    if(n==1||n==0)
    {
        return false;
    }
    for(long long i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
            return false;
        }
    }
    return true;
}

函数内先是特判,小学生都知道 既不是质数也不是合数。然后是真正的判断,先是一个循环。

注意!

写此处的时候有的人写的是:

for(long long i=2;i*i<=n;i++)

其他题可以这么写,但是此题不建议这么写,原因:如果 比较大, 超了 范围,那不就 了。

所以正确的写法是:

for(long long i=2;i<=n/i;i++)

时间复杂度的问题解决了,其它的就简单了。

最后是全部代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long n,k,a[N],b[N],ans;
bool foo(long long n)
{
	if(n==1||n==0)
	{
		return false;
	}
	for(long long i=2;i<=n/i;i++)
	{
		if(n%i==0)
		{
			return false;
		}
	}
	return true;
}
int main()
{
	cin>>n;
	for(long long i=n;i>=2;i--)
	{
		if(foo(i)==1)
		{
			cout<<i;
			break;
		}
	}
	return 0;
}
全部评论

相关推荐

喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
哥_留个offer先:跟他说,你这个最好用c#,微软就用c#Java不适合这个项目
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务