题目描述
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
输入
输入只有一行,包含一个正整数 n。
对于 30% 的数据,n≤1000;
对于全部数据,6≤n≤2×109。
输出
输出只有一行,包含一个正整数 p,即较大的那个质数。
样例输入
21
样例输出
7
思路:这就是到判断质数的题目,但暴力肯定不行,我们可以优化一下,比如增大步长,或者用线性筛,这道题我用的是增大步长的方法
代码:
#include<bits/stdc++.h>
using namespace std;
bool su(int a)
{
if(a==1) return 0;//特判
if(a==2||a==3) return 1;//特判
if(a%6!=1&&a%6!=5) return 0;
int temp=sqrt(a);
for(int i=5;i<=temp;i+=6)//增大步长到6,我们可以发现除了2,3,5,剩下的质数要出现只可能出现在6x的相邻两侧。这里要注意的一点是,在6的倍数相邻两侧并不是一定就是质数。 根据以上规律,判断质数可以6个为单元快进,
{
if(a%i==0||a%(i+2)==0) return 0;
}
return 1;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
if(n%i==0)
{
if(su(i)&&su(n/i))
{
cout<<max(i,n/i);
return 0;//发现第一个即可退出 ,因为找到了最大的
}
}
}
}