题目描述
已知正整数 𝑛是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 𝑛。
输出格式
输出一个正整数 p,即较大的那个质数。
输入样例
21
输出样例
7
说明/提示
【数据范围】
1≤n≤2×10^9
题目分析
质数:只有两个正因数(1和它本身)的自然数即为质数。
合数:比1大但不是质数的数称为合数。
1和0既非质数也非合数。
求质数的方法:
- 试除法
给定的整数n,除以1<i<n的数,如果都不能整除,则n为质数。
- 试除法优化
对于所有的整数,因数时成对出现的a*b=n,当a,b无限接近时a<= sqrt(n)。
因此,枚举范围可以缩小至2~sqrt(n)
- 埃氏筛法
对多个整数进行质数判断时,算法更优。假设多个整数中的最大值为20,算法实现过程:
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
2 | 2 | 3 | - | 5 | - | 7 | - | 9 | - | 11 | - | 13 | - | 15 | - | 17 | - | 19 | - |
3 | 2 | 3 | - | 5 | - | 7 | - | - | - | 11 | - | 13 | - | - | - | 17 | - | 19 | - |
5 | 2 | 3 | - | 5 | - | 7 | - | - | - | 11 | - | 13 | - | - | - | 17 | - | 19 | - |
7 | 2 | 3 | - | 5 | - | 7 | - | - | - | 11 | - | 13 | - | - | - | 17 | - | 19 | - |
- 遍历2~20所有整数数组a[i] (2<=i<=20),默认值a[i]=1;
- 最小整数i=2是质数,所有2的倍数均为不是质数,都划掉a[i]=0;
- i=3,如果a[3]=1,所有3的倍数均不是质数,都划掉a[i]=1;
- i=4,因为a[4]=0,4不是质数,继续下一个
- i=5,以为a[5]=1,所有5的倍数均不是质数,都划掉a[i]=1;
- 最后,剩余的a[i]=0的数,均为质数。
- 欧拉筛法
欧拉筛法原理同埃氏筛法,区别是埃氏筛法中一个合适可能会被筛多次,如9可以被2筛去也可以被3筛去,而欧拉筛法只让一个合数被筛选一次。
本题只筛选一个整数n,使用优化后的试除法就可以了。
代码实现
#include <bits/stdc++.h>
using namespace std;
int n;
int main(){
cin >> n;
for(int i=2;i<=sqrt(n);i++)
{
if (n%i==0)
{
cout << (n/i);
break;
}
}
return 0;
}