449. 质因数分解
已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。
输入格式
输入只有一行,包含一个正整数n。
输出格式
输出只有一行,包含一个正整数p,即较大的那个质数。
数据范围
$6≤n≤2∗10^9$
输入样例:
21
输出样例:
7
思路:
-
我们需要先了解一个算术基本定理如图:
这说明合数一定可以分解成唯一的一组质数的乘积
-
题里已经说了给出的
n
是两个质数的乘积,那就说明n
一定是合数,另外就是n
的分解形式是确定的了,一定是 质数×
质数(不可能是合数×
合数或者合数×
质数,因为这样的话合数又会被分解成质数,n
成了三个质数的乘积了,与题意不符)。 -
所有约数都是成对出现的:如果
d
是n
的约数,那么 $\frac{n}{d}$ 也是n
的约数。 -
我们可以只枚举较小的约数,然后计算出较大的约数即可。那么需要枚举的范围满足: $d ≤ \frac{n}{d}$,则 $d≤\sqrt{n}$。因此只需要枚举$\sqrt{n}$ 次。
时间复杂度
由于只枚举较小的约数,所以只需枚举 $\sqrt{n}$次,因此总时间复杂度是 $O(\sqrt{n})$。
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int t = (int)Math.sqrt(n);
for(int i = 2;i <= t;i++){
if(n % i == 0){//第一次遇到n的因子时,这个因子就是较小的那个因子
System.out.println(n / i);//输出较大的那个因子后,可以break直接退出for循环了
break;
}
}
}
}